diff --git a/package-lock.json b/package-lock.json index 5d75270..d1c36e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2487,14 +2487,14 @@ } }, "node_modules/@rosen-bridge/rosen-extractor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-1.0.2.tgz", - "integrity": "sha512-bqaMM1ux8i/Ui25oaOnaa0SWX5Zv099INaQ64/bEcS/kVsvoWzNlTihiaQsZpH7rQjhafNLQ7N5exWWH2U8HGA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-2.0.0.tgz", + "integrity": "sha512-GCqw7/YZ99L+UbyZOIHTCTCqfl1OUjJQFlQWgAjSjRa1CQIHjHhTUEj/rZdyHS/cY7t0wshckm63jDpJItQsaA==", "dependencies": { "@cardano-ogmios/schema": "^5.5.7", "@rosen-bridge/abstract-logger": "^0.3.0", "@rosen-bridge/tokens": "^1.0.0", - "ergo-lib-wasm-nodejs": "^0.24.0-alpha-1f24f53", + "ergo-lib-wasm-nodejs": "^0.24.1", "json-bigint": "^1.0.0", "lodash-es": "^4.17.21" } @@ -8820,13 +8820,13 @@ }, "packages/abstract-chain": { "name": "@rosen-chains/abstract-chain", - "version": "2.2.2", + "version": "3.0.0", "license": "GPL-3.0", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^1.0.2" + "@rosen-bridge/rosen-extractor": "^2.0.0" }, "devDependencies": { "@babel/preset-env": "^7.19.0", @@ -8846,14 +8846,14 @@ }, "packages/chains/cardano": { "name": "@rosen-chains/cardano", - "version": "2.3.1", + "version": "3.0.0", "license": "GPL-3.0", "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", - "@rosen-chains/abstract-chain": "^2.2.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", + "@rosen-chains/abstract-chain": "^3.0.0", "bech32": "^2.0.0", "blake2b": "^2.1.3" }, @@ -8876,13 +8876,13 @@ }, "packages/chains/ergo": { "name": "@rosen-chains/ergo", - "version": "2.3.3", + "version": "3.0.0", "license": "GPL-3.0", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^1.0.2", - "@rosen-chains/abstract-chain": "^2.2.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", + "@rosen-chains/abstract-chain": "^3.0.0", "blakejs": "^1.2.1", "ergo-lib-wasm-nodejs": "^0.24.1" }, @@ -8904,15 +8904,15 @@ }, "packages/networks/cardano-blockfrost": { "name": "@rosen-chains/cardano-blockfrost-network", - "version": "0.1.0", + "version": "1.0.0", "license": "GPL-3.0", "dependencies": { "@blockfrost/blockfrost-js": "^5.4.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/cardano": "^2.3.1" + "@rosen-bridge/rosen-extractor": "^2.0.0", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/cardano": "^3.0.0" }, "devDependencies": { "@types/node": "^18.11.18", @@ -9424,16 +9424,16 @@ }, "packages/networks/cardano-koios": { "name": "@rosen-chains/cardano-koios-network", - "version": "3.1.2", + "version": "4.0.0", "license": "GPL-3.0", "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/cardano": "^2.3.1", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/cardano": "^3.0.0", "@rosen-clients/cardano-koios": "^2.0.1" }, "devDependencies": { @@ -9471,15 +9471,15 @@ }, "packages/networks/ergo-explorer": { "name": "@rosen-chains/ergo-explorer-network", - "version": "2.3.4", + "version": "3.0.0", "license": "GPL-3.0", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/ergo": "^2.3.3", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/ergo": "^3.0.0", "@rosen-clients/ergo-explorer": "^1.0.3", "ergo-lib-wasm-nodejs": "^0.24.1", "it-all": "^3.0.1" @@ -9513,15 +9513,15 @@ }, "packages/networks/ergo-node": { "name": "@rosen-chains/ergo-node-network", - "version": "2.3.4", + "version": "3.0.0", "license": "GPL-3.0", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/ergo": "^2.3.3", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/ergo": "^3.0.0", "@rosen-clients/ergo-node": "^1.0.4", "ergo-lib-wasm-nodejs": "^0.24.1", "it-all": "^3.0.1" diff --git a/packages/abstract-chain/package.json b/packages/abstract-chain/package.json index fb9897b..8ced2cb 100644 --- a/packages/abstract-chain/package.json +++ b/packages/abstract-chain/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/abstract-chain", - "version": "2.2.2", + "version": "3.0.0", "description": "this project contains abstract classes to implement any chain for Rosen-bridge", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", @@ -23,7 +23,7 @@ "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^1.0.2" + "@rosen-bridge/rosen-extractor": "^2.0.0" }, "devDependencies": { "@babel/preset-env": "^7.19.0", diff --git a/packages/chains/cardano/lib/CardanoChain.ts b/packages/chains/cardano/lib/CardanoChain.ts index d450c11..0aec409 100644 --- a/packages/chains/cardano/lib/CardanoChain.ts +++ b/packages/chains/cardano/lib/CardanoChain.ts @@ -158,12 +158,14 @@ class CardanoChain extends AbstractUtxoChain { ); } const bankBoxes = coveredBoxes.boxes; + // calculate input boxes assets + let remainingAssets = CardanoUtils.calculateUtxoAssets(bankBoxes); + this.logger.debug(`Input assets: ${JsonBigInt.stringify(remainingAssets)}`); const txBuilder = CardanoWasm.TransactionBuilder.new( await this.getTxBuilderConfig() ); let orderValue = BigNum.zero(); - const orderAssets: Map = new Map(); // add outputs order.forEach((order) => { @@ -175,38 +177,33 @@ class CardanoChain extends AbstractUtxoChain { CardanoUtils.bigIntToBigNum(order.assets.nativeToken) ); + // reduce order value from remaining assets + remainingAssets = ChainUtils.subtractAssetBalance( + remainingAssets, + order.assets + ); + // create order output const address = CardanoWasm.Address.from_bech32(order.address); const value = CardanoWasm.Value.new( CardanoUtils.bigIntToBigNum(order.assets.nativeToken) ); // inserting assets - const paymentMultiAsset = CardanoWasm.MultiAsset.new(); + const orderMultiAsset = CardanoWasm.MultiAsset.new(); order.assets.tokens.forEach((asset) => { - // accumulate assets - if (orderAssets.has(asset.id)) { - orderAssets.set(asset.id, orderAssets.get(asset.id)! + asset.value); - } else { - orderAssets.set(asset.id, asset.value); - } - const paymentAssetInfo = CardanoUtils.getCardanoAssetInfo( - asset.id, - this.tokenMap + const assetInfo = asset.id.split('.'); + const policyId: CardanoWasm.ScriptHash = + CardanoWasm.ScriptHash.from_hex(assetInfo[0]); + const assetName: CardanoWasm.AssetName = CardanoWasm.AssetName.new( + Buffer.from(assetInfo[1], 'hex') ); - const paymentAssetPolicyId: CardanoWasm.ScriptHash = - CardanoWasm.ScriptHash.from_hex(paymentAssetInfo.policyId); - const paymentAssetAssetName: CardanoWasm.AssetName = - CardanoWasm.AssetName.new( - Buffer.from(paymentAssetInfo.assetName, 'hex') - ); - const paymentAssets = CardanoWasm.Assets.new(); - paymentAssets.insert( - paymentAssetAssetName, + orderMultiAsset.set_asset( + policyId, + assetName, CardanoUtils.bigIntToBigNum(asset.value) ); - paymentMultiAsset.insert(paymentAssetPolicyId, paymentAssets); }); - value.set_multiasset(paymentMultiAsset); + value.set_multiasset(orderMultiAsset); const orderBox = CardanoWasm.TransactionOutput.new(address, value); txBuilder.add_output(orderBox); }); @@ -223,38 +220,15 @@ class CardanoChain extends AbstractUtxoChain { CardanoWasm.Value.new(orderValue) ); }); + this.logger.debug( + `Remaining assets: ${JsonBigInt.stringify(remainingAssets)}` + ); // create change output - const inputBoxesAssets = CardanoUtils.calculateInputBoxesAssets(bankBoxes); - const changeBoxMultiAsset = CardanoWasm.MultiAsset.new(); - inputBoxesAssets.assets.forEach((value, key) => { - const assetInfo = key.split(','); - const assetName = CardanoWasm.AssetName.new( - Buffer.from(assetInfo[1], 'hex') - ); - const policyId = CardanoWasm.ScriptHash.from_hex(assetInfo[0]); - const fingerprint = CardanoUtils.createFingerprint(policyId, assetName); - const spentValue = CardanoUtils.bigIntToBigNum( - orderAssets.get(fingerprint) || 0n - ); - if (value.compare(spentValue) === 0) return; - changeBoxMultiAsset.set_asset( - policyId, - assetName, - value.checked_sub(spentValue) - ); - }); - const changeBoxLovelace = inputBoxesAssets.lovelace - .checked_sub(orderValue) - .checked_sub(CardanoUtils.bigIntToBigNum(this.configs.fee)); - - const changeAmount: CardanoWasm.Value = - CardanoWasm.Value.new(changeBoxLovelace); - changeAmount.set_multiasset(changeBoxMultiAsset); - this.logger.debug(`Change box amount: ${changeAmount.to_json()}`); - const changeBox = CardanoWasm.TransactionOutput.new( - CardanoWasm.Address.from_bech32(this.configs.addresses.lock), - changeAmount + remainingAssets.nativeToken -= this.configs.fee; + const changeBox = CardanoUtils.createTransactionOutput( + remainingAssets, + this.configs.addresses.lock ); txBuilder.add_output(changeBox); @@ -299,7 +273,7 @@ class CardanoChain extends AbstractUtxoChain { assets: { nativeToken: BigInt(box.value), tokens: box.assets.map((asset) => ({ - id: asset.fingerprint, + id: CardanoUtils.getAssetId(asset), value: BigInt(asset.quantity), })), }, @@ -421,7 +395,11 @@ class CardanoChain extends AbstractUtxoChain { // check if box satisfy conditions if (output.address !== address) continue; if (tokenId) { - if (!output.assets.find((asset) => asset.fingerprint === tokenId)) + if ( + !output.assets.find( + (asset) => CardanoUtils.getAssetId(asset) === tokenId + ) + ) continue; } @@ -721,14 +699,9 @@ class CardanoChain extends AbstractUtxoChain { for (let j = 0; j < asset.keys().len(); j++) { const assetName = asset.keys().get(j); const assetAmount = asset.get(assetName)!; - const fingerprint = cardanoUtils.createFingerprint( - scriptHash, - assetName - ); boxAssets.push({ - fingerprint: fingerprint, policy_id: scriptHash.to_hex(), - asset_name: assetName.to_hex(), + asset_name: CardanoUtils.assetNameToHex(assetName), quantity: BigInt(assetAmount.to_str()), }); } diff --git a/packages/chains/cardano/lib/CardanoUtils.ts b/packages/chains/cardano/lib/CardanoUtils.ts index c0eb314..86cd062 100644 --- a/packages/chains/cardano/lib/CardanoUtils.ts +++ b/packages/chains/cardano/lib/CardanoUtils.ts @@ -1,69 +1,50 @@ +import { CardanoUtxo, CardanoBoxCandidate, CardanoAsset } from './types'; import { - CardanoUtxo, - CardanoAssetInfo, - UtxoBoxesAssets, - CardanoBoxCandidate, -} from './types'; -import { AssetBalance, TokenInfo } from '@rosen-chains/abstract-chain'; + AssetBalance, + ChainUtils, + TokenInfo, +} from '@rosen-chains/abstract-chain'; import * as CardanoWasm from '@emurgo/cardano-serialization-lib-nodejs'; -import { TokenMap } from '@rosen-bridge/tokens'; -import { CARDANO_CHAIN } from './constants'; import { BigNum } from '@emurgo/cardano-serialization-lib-nodejs'; -import blake2b from 'blake2b'; -import { bech32 } from 'bech32'; class CardanoUtils { /** - * calculates amount of lovelace and assets in utxo boxes - * @param boxes the utxogenerateTransaction boxes + * generates asset id from policyId and assetName + * @param asset + * @returns */ - static calculateInputBoxesAssets = ( - boxes: CardanoUtxo[] - ): UtxoBoxesAssets => { - const assets: Map = new Map(); - let changeBoxLovelace: CardanoWasm.BigNum = CardanoWasm.BigNum.zero(); - boxes.forEach((box) => { - changeBoxLovelace = changeBoxLovelace.checked_add( - this.bigIntToBigNum(box.value) - ); - - box.assets.forEach((boxAsset) => { - const assetsInfo = `${boxAsset.policy_id},${boxAsset.asset_name}`; - const currentValue = - assets.get(assetsInfo) || CardanoWasm.BigNum.zero(); + static generateAssetId = (policyId: string, assetName: string) => + `${policyId}.${assetName}`; - assets.set( - assetsInfo, - currentValue.checked_add( - this.bigIntToBigNum(BigInt(boxAsset.quantity)) - ) - ); - }); - }); - return { - lovelace: changeBoxLovelace, - assets: assets, - }; - }; + /** + * generates asset id from CardanoAsset object + * @param asset + * @returns + */ + static getAssetId = (asset: CardanoAsset) => + this.generateAssetId(asset.policy_id, asset.asset_name); /** - * returns asset policy id and asset name from tokenMap, throws error if fingerprint not found - * @param fingerprint asset fingerprint - * @param tokenMap to search for fingerprint + * calculates total amount of lovelace and assets in list of CardanoUtxo + * @param utxos */ - static getCardanoAssetInfo = ( - fingerprint: string, - tokenMap: TokenMap - ): CardanoAssetInfo => { - const token = tokenMap.search(CARDANO_CHAIN, { - [tokenMap.getIdKey(CARDANO_CHAIN)]: fingerprint, - }); - if (token.length === 0) - throw new Error(`Asset fingerprint [${fingerprint}] not found in config`); - return { - policyId: token[0][CARDANO_CHAIN]['policyId'], - assetName: token[0][CARDANO_CHAIN]['assetName'], - }; + static calculateUtxoAssets = (utxos: CardanoUtxo[]): AssetBalance => { + return utxos + .map( + (utxo): AssetBalance => ({ + nativeToken: utxo.value, + tokens: utxo.assets.map( + (asset): TokenInfo => ({ + id: this.getAssetId(asset), + value: asset.quantity, + }) + ), + }) + ) + .reduce(ChainUtils.sumAssetBalance, { + nativeToken: 0n, + tokens: [], + }); }; /** @@ -81,9 +62,11 @@ class CardanoUtils { for (let j = 0; j < asset.keys().len(); j++) { const assetName = asset.keys().get(j); const assetAmount = asset.get(assetName)!; - const fingerprint = this.createFingerprint(scriptHash, assetName); tokens.push({ - id: fingerprint, + id: this.generateAssetId( + scriptHash.to_hex(), + this.assetNameToHex(assetName) + ), value: BigInt(assetAmount.to_str()), }); } @@ -104,22 +87,12 @@ class CardanoUtils { }; /** - * create fingerprint from policy id and asset name - * @param policyId in Uint8Array - * @param assetName in Uint8Array + * gets assetName hex from CardanoWasm.AssetName object + * @param assetName + * @returns */ - static createFingerprint = ( - policyId: CardanoWasm.ScriptHash, - assetName: CardanoWasm.AssetName - ): string => { - const policyIdBytes = policyId.to_bytes(); - const assetNameBytes = Buffer.from(assetName.to_js_value(), 'hex'); - const hashBuf = blake2b(20) - .update(new Uint8Array([...policyIdBytes, ...assetNameBytes])) - .digest('binary'); - const words = bech32.toWords(hashBuf); - return bech32.encode('asset', words); - }; + static assetNameToHex = (assetName: CardanoWasm.AssetName): string => + Buffer.from(assetName.name()).toString('hex'); /** * get box id from CardanoWasm.TransactionInput or CardanoUtxo @@ -152,6 +125,42 @@ class CardanoUtils { value: candidate.value, assets: structuredClone(candidate.assets), }); + + /** + * creates a box candidate by assets and address + * @param assets + * @param address + * @returns + */ + static createTransactionOutput = ( + assets: AssetBalance, + address: string + ): CardanoWasm.TransactionOutput => { + const changeBoxMultiAsset = CardanoWasm.MultiAsset.new(); + assets.tokens.forEach((asset) => { + const assetInfo = asset.id.split('.'); + const policyId: CardanoWasm.ScriptHash = CardanoWasm.ScriptHash.from_hex( + assetInfo[0] + ); + const assetName: CardanoWasm.AssetName = CardanoWasm.AssetName.new( + Buffer.from(assetInfo[1], 'hex') + ); + changeBoxMultiAsset.set_asset( + policyId, + assetName, + CardanoUtils.bigIntToBigNum(asset.value) + ); + }); + + const changeAmount: CardanoWasm.Value = CardanoWasm.Value.new( + CardanoWasm.BigNum.from_str(assets.nativeToken.toString()) + ); + changeAmount.set_multiasset(changeBoxMultiAsset); + return CardanoWasm.TransactionOutput.new( + CardanoWasm.Address.from_bech32(address), + changeAmount + ); + }; } export default CardanoUtils; diff --git a/packages/chains/cardano/lib/index.ts b/packages/chains/cardano/lib/index.ts index 1843962..4696eea 100644 --- a/packages/chains/cardano/lib/index.ts +++ b/packages/chains/cardano/lib/index.ts @@ -1,6 +1,7 @@ export { default as CardanoChain } from './CardanoChain'; export { default as AbstractCardanoNetwork } from './network/AbstractCardanoNetwork'; export { default as CardanoTransaction } from './CardanoTransaction'; +export { default as CardanoUtils } from './CardanoUtils'; export * from './types'; export * from './constants'; diff --git a/packages/chains/cardano/lib/types.ts b/packages/chains/cardano/lib/types.ts index b094f8f..0f895d3 100644 --- a/packages/chains/cardano/lib/types.ts +++ b/packages/chains/cardano/lib/types.ts @@ -2,7 +2,6 @@ import { ChainConfigs, PaymentTransactionJsonModel, } from '@rosen-chains/abstract-chain'; -import { BigNum } from '@emurgo/cardano-serialization-lib-nodejs'; interface CardanoConfigs extends ChainConfigs { minBoxValue: bigint; @@ -14,12 +13,6 @@ interface CardanoAsset { policy_id: string; asset_name: string; quantity: bigint; - fingerprint: string; -} - -interface CardanoAssetInfo { - policyId: string; - assetName: string; } interface CardanoUtxo { @@ -45,11 +38,6 @@ interface CardanoTx { metadata?: CardanoMetadata; } -interface UtxoBoxesAssets { - lovelace: BigNum; - assets: Map; -} - interface CardanoTransactionJsonModel extends PaymentTransactionJsonModel { inputUtxos: Array; } @@ -67,12 +55,10 @@ interface CardanoProtocolParameters { export { CardanoConfigs, CardanoAsset, - CardanoAssetInfo, CardanoUtxo, CardanoBoxCandidate, CardanoMetadata, CardanoTx, - UtxoBoxesAssets, CardanoTransactionJsonModel, CardanoProtocolParameters, }; diff --git a/packages/chains/cardano/package.json b/packages/chains/cardano/package.json index d9f949e..635d5de 100644 --- a/packages/chains/cardano/package.json +++ b/packages/chains/cardano/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/cardano", - "version": "2.3.1", + "version": "3.0.0", "description": "this project contains cardano chain for Rosen-bridge", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", @@ -22,9 +22,9 @@ "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-chains/abstract-chain": "^2.2.2", + "@rosen-chains/abstract-chain": "^3.0.0", "bech32": "^2.0.0", "blake2b": "^2.1.3" }, diff --git a/packages/chains/cardano/tests/CardanoChain.spec.ts b/packages/chains/cardano/tests/CardanoChain.spec.ts index 323b36a..65b2dc8 100644 --- a/packages/chains/cardano/tests/CardanoChain.spec.ts +++ b/packages/chains/cardano/tests/CardanoChain.spec.ts @@ -502,7 +502,8 @@ describe('CardanoChain', () => { ); // call the function - const trackingTokenId = 'asset17q7r59zlc3dgw0venc80pdv566q6yguw03f0d9'; + const trackingTokenId = + 'a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235.484f534b59'; const cardanoChain = generateChainObject(network); const result = await cardanoChain.getMempoolBoxMapping( trackingAddress, @@ -539,7 +540,8 @@ describe('CardanoChain', () => { ); // call the function - const trackingTokenId = 'asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2'; + const trackingTokenId = + '48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b.5273744572676f546f6b656e7654657374'; spyOn(network, 'getMempoolTransactions').mockResolvedValueOnce( transactions ); @@ -640,7 +642,8 @@ describe('CardanoChain', () => { ); // call the function - const trackingTokenId = 'asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz'; + const trackingTokenId = + 'ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286.5273744552477654657374'; const result = testInstance.callGetTransactionsBoxMapping( transactions, configs.addresses.lock, diff --git a/packages/chains/cardano/tests/testData.ts b/packages/chains/cardano/tests/testData.ts index c413efe..e4b35f9 100644 --- a/packages/chains/cardano/tests/testData.ts +++ b/packages/chains/cardano/tests/testData.ts @@ -9,7 +9,7 @@ export const testTokenMap = ` { "idKeys" : { "ergo" : "tokenId", - "cardano" : "fingerprint" + "cardano" : "tokenId" }, "tokens" : [ { @@ -23,7 +23,7 @@ export const testTokenMap = ` } }, "cardano" : { - "fingerprint" : "asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz", + "tokenId" : "ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286.5273744552477654657374", "policyId" : "ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286", "assetName" : "5273744552477654657374", "decimals" : 0, @@ -44,7 +44,7 @@ export const testTokenMap = ` } }, "cardano" : { - "fingerprint" : "ada", + "tokenId" : "ada", "policyId" : "", "assetName" : "414441", "decimals" : 6, @@ -65,7 +65,7 @@ export const testTokenMap = ` } }, "cardano" : { - "fingerprint" : "asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7", + "tokenId" : "cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be.43617264616e6f546f6b656e7654657374", "policyId" : "cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be", "assetName" : "43617264616e6f546f6b656e7654657374", "decimals" : 0, @@ -86,7 +86,7 @@ export const testTokenMap = ` } }, "cardano" : { - "fingerprint" : "asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2", + "tokenId" : "48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b.5273744572676f546f6b656e7654657374", "policyId" : "48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b", "assetName" : "5273744572676f546f6b656e7654657374", "decimals" : 0, @@ -196,25 +196,25 @@ export const transaction1BoxMapping = [ inputId: '3101943d053d487d78578f230518bd7068ad166d1b1b63488ec822cdcff143a8.0', serializedOutput: - '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"fingerprint":"asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2","asset_name":"515273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"fingerprint":"asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7","asset_name":"5143617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"fingerprint":"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz","asset_name":"4b5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', + '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"asset_name":"5273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"asset_name":"43617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"asset_name":"5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', }, { inputId: 'a878d4560455eff78e9e81721743473b40d55898cb3162dd643d4c4821e05803.0', serializedOutput: - '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"fingerprint":"asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2","asset_name":"515273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"fingerprint":"asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7","asset_name":"5143617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"fingerprint":"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz","asset_name":"4b5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', + '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"asset_name":"5273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"asset_name":"43617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"asset_name":"5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', }, { inputId: 'b2e02269dba680b63f4ac4dfa9f5c967bc208af685709ab9cc2228839547ae52.0', serializedOutput: - '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"fingerprint":"asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2","asset_name":"515273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"fingerprint":"asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7","asset_name":"5143617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"fingerprint":"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz","asset_name":"4b5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', + '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"asset_name":"5273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"asset_name":"43617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"asset_name":"5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', }, { inputId: 'bd391046e9cdb40592eae98e2bb65abf75756ae21b4011044b883e7799c68a33.2', serializedOutput: - '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"fingerprint":"asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2","asset_name":"515273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"fingerprint":"asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7","asset_name":"5143617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"fingerprint":"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz","asset_name":"4b5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', + '{"address":"addr1qxwkc9uhw02wvkgw9qkrw2twescuc2ss53t5yaedl0zcyen2a0y7redvgjx0t0al56q9dkyzw095eh8jw7luan2kh38qpw3xgs","value":137010000,"assets":[{"asset_name":"5273744572676f546f6b656e7654657374","policy_id":"48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b","quantity":5000},{"asset_name":"43617264616e6f546f6b656e7654657374","policy_id":"cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be","quantity":100},{"asset_name":"5273744552477654657374","policy_id":"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286","quantity":900}]}', }, ]; @@ -226,7 +226,7 @@ export const transaction1Order: PaymentOrder = [ nativeToken: 2000000n, tokens: [ { - id: 'asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz', + id: 'ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286.5273744552477654657374', value: 100n, }, ], @@ -242,10 +242,10 @@ export const transaction1PaymentTransaction = ` "txId":"0066ad9bffa8579a6a7b6f5b6d8fdab20107eca2a2f8435235271173532acab1", "txType":"payment", "inputUtxos": [ - "{\\"txId\\":\\"2d10e4c431dc9d6f35319720ba6fa9d1973fa4e4d9802fd1cae01540d1b1b9e3\\",\\"index\\":0,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000,\\"fingerprint\\":\\"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz\\"}]}", - "{\\"txId\\":\\"f5bbdeba6cc2ef8eac2fb24879d3a11df3b067a4fc5d1559ccf2ae21f0129631\\",\\"index\\":2,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000,\\"fingerprint\\":\\"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz\\"}]}", - "{\\"txId\\":\\"92d99216cefcf40ff63f223061cf111950bed5c21da459ab540f439a92b8e942\\",\\"index\\":0,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000,\\"fingerprint\\":\\"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz\\"}]}", - "{\\"txId\\":\\"ecb1361fba075163d41bd38bb532ffd0a6e0c1971d15c28c3f002c9282a420e4\\",\\"index\\":0,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000,\\"fingerprint\\":\\"asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz\\"}]}" + "{\\"txId\\":\\"2d10e4c431dc9d6f35319720ba6fa9d1973fa4e4d9802fd1cae01540d1b1b9e3\\",\\"index\\":0,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000}]}", + "{\\"txId\\":\\"f5bbdeba6cc2ef8eac2fb24879d3a11df3b067a4fc5d1559ccf2ae21f0129631\\",\\"index\\":2,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000}]}", + "{\\"txId\\":\\"92d99216cefcf40ff63f223061cf111950bed5c21da459ab540f439a92b8e942\\",\\"index\\":0,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000}]}", + "{\\"txId\\":\\"ecb1361fba075163d41bd38bb532ffd0a6e0c1971d15c28c3f002c9282a420e4\\",\\"index\\":0,\\"value\\":10000,\\"assets\\":[{\\"policy_id\\":\\"ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286\\",\\"asset_name\\":\\"5273744552477654657374\\",\\"quantity\\":1000}]}" ] } `; @@ -257,14 +257,17 @@ export const transaction1Assets: AssetBalance = { nativeToken: 140010000n, tokens: [ { - id: 'asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz', + id: 'ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286.5273744552477654657374', value: 1000n, }, { - id: 'asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2', + id: '48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b.5273744572676f546f6b656e7654657374', value: 5000n, }, - { id: 'asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7', value: 100n }, + { + id: 'cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be.43617264616e6f546f6b656e7654657374', + value: 100n, + }, ], }; @@ -272,7 +275,7 @@ export const transaction1InputAssets: AssetBalance = { nativeToken: 40000n, tokens: [ { - id: 'asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz', + id: 'ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286.5273744552477654657374', value: 4000n, }, ], @@ -306,7 +309,7 @@ export const transaction4Order: PaymentOrder = [ nativeToken: 10000000n, tokens: [ { - id: 'asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz', + id: 'ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286.5273744552477654657374', value: 1000n, }, ], @@ -411,7 +414,6 @@ export const cardanoTx1: CardanoTx = { policy_id: 'a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235', asset_name: '484f534b59', quantity: 184272501n, - fingerprint: 'asset17q7r59zlc3dgw0venc80pdv566q6yguw03f0d9', }, ], }, @@ -426,7 +428,6 @@ export const cardanoTx1: CardanoTx = { policy_id: 'a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235', asset_name: '484f534b59', quantity: 184272501n, - fingerprint: 'asset17q7r59zlc3dgw0venc80pdv566q6yguw03f0d9', }, ], }, diff --git a/packages/chains/cardano/tests/testUtils.ts b/packages/chains/cardano/tests/testUtils.ts index bbf6fe2..c159ed2 100644 --- a/packages/chains/cardano/tests/testUtils.ts +++ b/packages/chains/cardano/tests/testUtils.ts @@ -13,13 +13,11 @@ export const mockBankBoxes = (): CardanoUtxo[] => { policy_id: 'cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be', asset_name: '43617264616e6f546f6b656e7654657374', quantity: 55n, - fingerprint: 'asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7', }, { policy_id: '48d4a14b8407af8407702df3afda4cc8a945ce55235e9808c62c5f9b', asset_name: '5273744572676f546f6b656e7654657374', quantity: 5000n, - fingerprint: 'asset1v25eyenfzrv6me9hw4vczfprdctzy5ed3x99p2', }, ], }; @@ -32,7 +30,6 @@ export const mockBankBoxes = (): CardanoUtxo[] => { policy_id: 'cfd784ccfe5fe8ce7d09f4ddb65624378cc8022bf3ec240cf41ea6be', asset_name: '43617264616e6f546f6b656e7654657374', quantity: 45n, - fingerprint: 'asset14d5uaspqyn87ecp8j4yawmguwrgun5086533z7', }, ], }; @@ -51,7 +48,6 @@ export const mockBankBoxes = (): CardanoUtxo[] => { policy_id: 'ef6aa6200e21634e58ce6796b4b61d1d7d059d2ebe93c2996eeaf286', asset_name: '5273744552477654657374', quantity: 1000n, - fingerprint: 'asset1jy5q5a0vpstutq5q6d8cgdmrd4qu5yefcdnjgz', }, ], }; @@ -64,13 +60,11 @@ export const mockBankBoxes = (): CardanoUtxo[] => { policy_id: '8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9', asset_name: '52535457', quantity: 30n, - fingerprint: 'asset1vwun0a52xjv5tc2x92wgr6x3p6q3u4frnmq8q0', }, { policy_id: '8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9', asset_name: '52535450', quantity: 40n, - fingerprint: 'asset10j94tmxef7rjgae9gq4r9qc66jhh6060teah0t', }, ], }; diff --git a/packages/chains/ergo/package.json b/packages/chains/ergo/package.json index 1745ec9..ab36833 100644 --- a/packages/chains/ergo/package.json +++ b/packages/chains/ergo/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/ergo", - "version": "2.3.3", + "version": "3.0.0", "description": "this project contains ergo chain for Rosen-bridge", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", @@ -22,8 +22,8 @@ "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^1.0.2", - "@rosen-chains/abstract-chain": "^2.2.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", + "@rosen-chains/abstract-chain": "^3.0.0", "blakejs": "^1.2.1", "ergo-lib-wasm-nodejs": "^0.24.1" }, diff --git a/packages/networks/cardano-blockfrost/lib/CardanoBlockFrostNetwork.ts b/packages/networks/cardano-blockfrost/lib/CardanoBlockFrostNetwork.ts index f679199..435534b 100644 --- a/packages/networks/cardano-blockfrost/lib/CardanoBlockFrostNetwork.ts +++ b/packages/networks/cardano-blockfrost/lib/CardanoBlockFrostNetwork.ts @@ -8,6 +8,7 @@ import { CardanoBoxCandidate, CardanoProtocolParameters, CardanoMetadata, + CardanoUtils, } from '@rosen-chains/cardano'; import { RosenTokens } from '@rosen-bridge/tokens'; import { @@ -35,8 +36,6 @@ import { BlockfrostClientError, BlockfrostServerError, } from '@blockfrost/blockfrost-js'; -import blake2b from 'blake2b'; -import { bech32 } from 'bech32'; import { PAGE_ITEM_COUNT } from './constants'; import { components } from '@blockfrost/openapi'; @@ -147,12 +146,8 @@ class CardanoBlockFrostNetwork extends AbstractCardanoNetwork { if (asset.unit === 'lovelace') return; const policyId = asset.unit.slice(0, 56); const assetName = asset.unit.slice(56); - const fingerprint = this.generateAssetFingerprint( - policyId, - assetName - ); tokens.push({ - id: fingerprint, + id: CardanoUtils.generateAssetId(policyId, assetName), value: BigInt(asset.quantity), }); }); @@ -523,24 +518,6 @@ class CardanoBlockFrostNetwork extends AbstractCardanoNetwork { }; }; - /** - * generates asset fingerprint from policyId and assetName - * @param policyId - * @param assetName - * @returns asset fingerprint - */ - protected generateAssetFingerprint = ( - policyId: string, - assetName: string - ): string => { - const policyIdBuffer = Buffer.from(policyId, 'hex'); - const assetNameBuffer = Buffer.from(assetName, 'hex'); - const assetHash = blake2b(20) - .update(new Uint8Array([...policyIdBuffer, ...assetNameBuffer])) - .digest('binary'); - return bech32.encode('asset', bech32.toWords(assetHash)); - }; - /** * converts CardanoAssets object from BlockFrostAsset * @param asset BlockFrostAsset object @@ -563,12 +540,10 @@ class CardanoBlockFrostNetwork extends AbstractCardanoNetwork { if (asset.unit === 'lovelace') return; const policyId = asset.unit.slice(0, 56); const assetName = asset.unit.slice(56); - const fingerprint = this.generateAssetFingerprint(policyId, assetName); cardanoAssets.push({ policy_id: policyId, asset_name: assetName, quantity: BigInt(asset.quantity), - fingerprint: fingerprint, }); }); diff --git a/packages/networks/cardano-blockfrost/package.json b/packages/networks/cardano-blockfrost/package.json index cea1192..d78c3a1 100644 --- a/packages/networks/cardano-blockfrost/package.json +++ b/packages/networks/cardano-blockfrost/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/cardano-blockfrost-network", - "version": "0.1.0", + "version": "1.0.0", "description": "a package to be used as network api provider for @rosen-chains/cardano package", "repository": "@rosen-chains/cardano-blockfrost-network", "license": "GPL-3.0", @@ -35,8 +35,8 @@ "@blockfrost/blockfrost-js": "^5.4.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/cardano": "^2.3.1" + "@rosen-bridge/rosen-extractor": "^2.0.0", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/cardano": "^3.0.0" } } diff --git a/packages/networks/cardano-blockfrost/tests/CardanoBlockFrostNetwork.spec.ts b/packages/networks/cardano-blockfrost/tests/CardanoBlockFrostNetwork.spec.ts index 37063e9..9638d3d 100644 --- a/packages/networks/cardano-blockfrost/tests/CardanoBlockFrostNetwork.spec.ts +++ b/packages/networks/cardano-blockfrost/tests/CardanoBlockFrostNetwork.spec.ts @@ -152,7 +152,7 @@ describe('CardanoBlockFrostNetwork', () => { expect(result).toEqual({ nativeToken: testData.addressBalance, tokens: testData.addressAssets.map((asset) => ({ - id: asset.fingerprint, + id: `${asset.policy_id}.${asset.asset_name}`, value: BigInt(asset.quantity), })), }); diff --git a/packages/networks/cardano-blockfrost/tests/testData.ts b/packages/networks/cardano-blockfrost/tests/testData.ts index 81dd65b..9542f7e 100644 --- a/packages/networks/cardano-blockfrost/tests/testData.ts +++ b/packages/networks/cardano-blockfrost/tests/testData.ts @@ -256,7 +256,6 @@ export const rosenTransactionInCardanoTx: CardanoTx = { { policy_id: '8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9', asset_name: '52535457', - fingerprint: 'asset1vwun0a52xjv5tc2x92wgr6x3p6q3u4frnmq8q0', quantity: 1455n, }, ], @@ -276,7 +275,6 @@ export const rosenTransactionInCardanoTx: CardanoTx = { { policy_id: '8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9', asset_name: '52535457', - fingerprint: 'asset1vwun0a52xjv5tc2x92wgr6x3p6q3u4frnmq8q0', quantity: 1455n, }, ], @@ -452,7 +450,6 @@ export const differentMetadataTransactionInCardanoTx: CardanoTx = { { policy_id: '40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728', asset_name: '436c61794e6174696f6e39353837', - fingerprint: 'asset14yxvcdm6u4mqz8dcud8nv0vvxf74ufaqt3shvg', quantity: 1n, }, ], @@ -484,7 +481,6 @@ export const differentMetadataTransactionInCardanoTx: CardanoTx = { { policy_id: '40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728', asset_name: '436c61794e6174696f6e39353837', - fingerprint: 'asset14yxvcdm6u4mqz8dcud8nv0vvxf74ufaqt3shvg', quantity: 1n, }, ], @@ -509,7 +505,6 @@ export const addressAssets = [ quantity: '15888202094', policy_id: '0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47', asset_name: '5273455247', - fingerprint: 'asset1p40r0eun2alszlxhj7k4uylya4cj54lxkjjmsm', }, { address: address, @@ -517,7 +512,6 @@ export const addressAssets = [ quantity: '1866325', policy_id: '8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9', asset_name: '52535457', - fingerprint: 'asset1vwun0a52xjv5tc2x92wgr6x3p6q3u4frnmq8q0', }, ]; @@ -634,7 +628,6 @@ export const expectedAddressUtxoSet = [ policy_id: '0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47', asset_name: '5273455247', quantity: 64576047n, - fingerprint: 'asset1p40r0eun2alszlxhj7k4uylya4cj54lxkjjmsm', }, ], }, @@ -647,7 +640,6 @@ export const expectedAddressUtxoSet = [ policy_id: '0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47', asset_name: '5273455247', quantity: 57617503n, - fingerprint: 'asset1p40r0eun2alszlxhj7k4uylya4cj54lxkjjmsm', }, ], }, @@ -776,7 +768,6 @@ export const txUtxo: CardanoUtxo = { policy_id: '0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47', asset_name: '5273455247', quantity: 64576047n, - fingerprint: 'asset1p40r0eun2alszlxhj7k4uylya4cj54lxkjjmsm', }, ], }; diff --git a/packages/networks/cardano-koios/lib/CardanoKoiosNetwork.ts b/packages/networks/cardano-koios/lib/CardanoKoiosNetwork.ts index 9c72751..c979e4a 100644 --- a/packages/networks/cardano-koios/lib/CardanoKoiosNetwork.ts +++ b/packages/networks/cardano-koios/lib/CardanoKoiosNetwork.ts @@ -11,6 +11,7 @@ import { CardanoTx, CardanoAsset, CardanoProtocolParameters, + CardanoUtils, } from '@rosen-chains/cardano'; import { RosenTokens } from '@rosen-bridge/tokens'; import { @@ -160,10 +161,10 @@ class CardanoKoiosNetwork extends AbstractCardanoNetwork { } } tokens = addressAssets.map((asset) => { - if (!asset.fingerprint || !asset.quantity) + if (!asset.policy_id || !asset.asset_name || !asset.quantity) throw new KoiosNullValueError('Asset info is null'); return { - id: asset.fingerprint, + id: CardanoUtils.generateAssetId(asset.policy_id, asset.asset_name), value: BigInt(asset.quantity), }; }); @@ -494,21 +495,13 @@ class CardanoKoiosNetwork extends AbstractCardanoNetwork { private parseAssetList = ( asset: TxInfoItemOutputsItemAssetListItem ): CardanoAsset => { - if ( - !( - asset.policy_id && - asset.asset_name && - asset.quantity && - asset.fingerprint - ) - ) + if (!(asset.policy_id && asset.asset_name && asset.quantity)) throw new KoiosNullValueError('UTxO asset info items are null'); return { policy_id: asset.policy_id, asset_name: asset.asset_name, quantity: BigInt(asset.quantity), - fingerprint: asset.fingerprint, }; }; diff --git a/packages/networks/cardano-koios/package.json b/packages/networks/cardano-koios/package.json index 681e38a..50e3851 100644 --- a/packages/networks/cardano-koios/package.json +++ b/packages/networks/cardano-koios/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/cardano-koios-network", - "version": "3.1.2", + "version": "4.0.0", "description": "cardano koios network package for rosen cardano chain", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", @@ -23,10 +23,10 @@ "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/cardano": "^2.3.1", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/cardano": "^3.0.0", "@rosen-clients/cardano-koios": "^2.0.1" }, "devDependencies": { diff --git a/packages/networks/cardano-koios/tests/CardanoKoiosNetwork.spec.ts b/packages/networks/cardano-koios/tests/CardanoKoiosNetwork.spec.ts index ac30598..88b368d 100644 --- a/packages/networks/cardano-koios/tests/CardanoKoiosNetwork.spec.ts +++ b/packages/networks/cardano-koios/tests/CardanoKoiosNetwork.spec.ts @@ -140,7 +140,7 @@ describe('CardanoKoiosNetwork', () => { expect(result).toEqual({ nativeToken: BigInt(testData.addressBalance), tokens: testData.addressAssets.map((asset) => ({ - id: asset.fingerprint, + id: `${asset.policy_id}.${asset.asset_name}`, value: BigInt(asset.quantity), })), }); diff --git a/packages/networks/cardano-koios/tests/testData.ts b/packages/networks/cardano-koios/tests/testData.ts index bff236c..5261248 100644 --- a/packages/networks/cardano-koios/tests/testData.ts +++ b/packages/networks/cardano-koios/tests/testData.ts @@ -223,7 +223,7 @@ export const rosenMetadataTxKoiosResponse = `{ "native_scripts": [], "plutus_contracts": [] }`; -export const expectedRosenMetadataTxResponse = `{"id":"98884bf40d8ebbd89ad78c6deaa31f0cc47938d941bfc0452bbc9a13aeb37cd3","inputs":[{"txId":"ed688bc21f5ed822adadd1f61415821def778201323c8e998baf350e0647ce49","index":0,"value":3000000,"assets":[{"policy_id":"8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9","asset_name":"52535457","quantity":1455,"fingerprint":"asset1vwun0a52xjv5tc2x92wgr6x3p6q3u4frnmq8q0"}]}],"outputs":[{"address":"addr1qyrgrphdsy7lta2rae2pu8hp5mw2fnpvu8se00rxa6zzmc4sh4gyfkdhpwfq8lnh5l95663d09n3s9crutnc9ywamcvqs5e5m6","value":1444518,"assets":[{"policy_id":"8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9","asset_name":"52535457","quantity":1455,"fingerprint":"asset1vwun0a52xjv5tc2x92wgr6x3p6q3u4frnmq8q0"}]},{"address":"addr1v8xputtxppjx9f255nqgz0xv9cquqm4ndemd659zdz4nznc7guuzv","value":1286857,"assets":[]}],"fee":268625,"metadata":{"0":{"to":"ergo","bridgeFee":"300000","toAddress":"9hZxV3YNSfbCqS6GEses7DhAVSatvaoNtdsiNvkimPGG2c8fzkG","networkFee":"500000","fromAddress":["addr1qyrgrphdsy7lta2rae2pu8hp5mw2fnpvu8se00rxa6zzmc4sh4gyfkdhpwf","q8lnh5l95663d09n3s9crutnc9ywamcvqs5e5m6"]}}}`; +export const expectedRosenMetadataTxResponse = `{"id":"98884bf40d8ebbd89ad78c6deaa31f0cc47938d941bfc0452bbc9a13aeb37cd3","inputs":[{"txId":"ed688bc21f5ed822adadd1f61415821def778201323c8e998baf350e0647ce49","index":0,"value":3000000,"assets":[{"policy_id":"8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9","asset_name":"52535457","quantity":1455}]}],"outputs":[{"address":"addr1qyrgrphdsy7lta2rae2pu8hp5mw2fnpvu8se00rxa6zzmc4sh4gyfkdhpwfq8lnh5l95663d09n3s9crutnc9ywamcvqs5e5m6","value":1444518,"assets":[{"policy_id":"8e3e19131f96c186335b23bf7983ab00867a987ca900abb27ae0f2b9","asset_name":"52535457","quantity":1455}]},{"address":"addr1v8xputtxppjx9f255nqgz0xv9cquqm4ndemd659zdz4nznc7guuzv","value":1286857,"assets":[]}],"fee":268625,"metadata":{"0":{"to":"ergo","bridgeFee":"300000","toAddress":"9hZxV3YNSfbCqS6GEses7DhAVSatvaoNtdsiNvkimPGG2c8fzkG","networkFee":"500000","fromAddress":["addr1qyrgrphdsy7lta2rae2pu8hp5mw2fnpvu8se00rxa6zzmc4sh4gyfkdhpwf","q8lnh5l95663d09n3s9crutnc9ywamcvqs5e5m6"]}}}`; export const differentMetadataTxId = 'dd8fc82e9ca2d38cffdfb2ab9ec51ea8158f7ade67b95c2dece63de3b8f836a7'; @@ -395,7 +395,7 @@ export const differentMetadataTxKoiosResponse = `{ } ] }`; -export const expectedDifferentMetadataTxResponse = `{"id":"dd8fc82e9ca2d38cffdfb2ab9ec51ea8158f7ade67b95c2dece63de3b8f836a7","inputs":[{"txId":"86bd079733207c6b4ba764fb5408fa59b74ef1733e8b3f9f6e8ef41ac3c048f9","index":0,"value":350077236,"assets":[]},{"txId":"6173600230d8e09bd61520c4f451ab9f1efca9e3a082a149bcc6914896997695","index":1,"value":932000000,"assets":[{"policy_id":"40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728","asset_name":"436c61794e6174696f6e39353837","quantity":1,"fingerprint":"asset14yxvcdm6u4mqz8dcud8nv0vvxf74ufaqt3shvg"}]}],"outputs":[{"address":"addr1qxmpg2p8xfrk0qyz5ksjqtk93u04vd6alds3w6dhrj4vcsvzc3ed2wp3m7m7m7pjt8x5qlh8v9we55n3kg4duw7kcwxsxt52zf","value":319849555,"assets":[]},{"address":"addr1w8cvzcnclvkua25vx26j72pddatuedsxspm62mr63urs0fctuuzfv","value":962000000,"assets":[{"policy_id":"40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728","asset_name":"436c61794e6174696f6e39353837","quantity":1,"fingerprint":"asset14yxvcdm6u4mqz8dcud8nv0vvxf74ufaqt3shvg"}]}],"fee":227681,"metadata":{"674":{"msg":["Mutant Labs Raffle","Buy 5 tickets for Raffle 64625b85e66d67ce15babf40"]}}}`; +export const expectedDifferentMetadataTxResponse = `{"id":"dd8fc82e9ca2d38cffdfb2ab9ec51ea8158f7ade67b95c2dece63de3b8f836a7","inputs":[{"txId":"86bd079733207c6b4ba764fb5408fa59b74ef1733e8b3f9f6e8ef41ac3c048f9","index":0,"value":350077236,"assets":[]},{"txId":"6173600230d8e09bd61520c4f451ab9f1efca9e3a082a149bcc6914896997695","index":1,"value":932000000,"assets":[{"policy_id":"40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728","asset_name":"436c61794e6174696f6e39353837","quantity":1}]}],"outputs":[{"address":"addr1qxmpg2p8xfrk0qyz5ksjqtk93u04vd6alds3w6dhrj4vcsvzc3ed2wp3m7m7m7pjt8x5qlh8v9we55n3kg4duw7kcwxsxt52zf","value":319849555,"assets":[]},{"address":"addr1w8cvzcnclvkua25vx26j72pddatuedsxspm62mr63urs0fctuuzfv","value":962000000,"assets":[{"policy_id":"40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728","asset_name":"436c61794e6174696f6e39353837","quantity":1}]}],"fee":227681,"metadata":{"674":{"msg":["Mutant Labs Raffle","Buy 5 tickets for Raffle 64625b85e66d67ce15babf40"]}}}`; export const txBytes = '84a400818258205c4f4494618db7e9a3122eb94bb8dc4a8596dbf9d282062ca64475e53c2d9371010182825839010365ded8ab99a8862e248ee53f25e6ea3d6901a1e1aaf42665da948f53812d75db5cd24f281d1bf324237d7d12c69d42d13cafd0620b3013821a002dc6c0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0c26467882581d6153ae5704f4e854362cc8b08b5e0229cfc998b237769eba56157a106c821a3d4aa5f2a3581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a7b2dbe5c581cbb2250e4c589539fd141fbbd2c322d380f1ce2aaef812cd87110d61ba14e527374434f4d45545654657374321b00000004e38cc250581cd2f6eb37450a3d568de93d623e69bd0ba1238daacc883d75736abd23a14c5273744572675654657374321b0de0b6b06dd70ec0021a00061a80031a056de76fa10081825820c34e5645d83d7c0319d1e73bb8a272592b16bb9b6f450811e52f9bb6f943dec858405aafe73b3a198272c2056836c9268ce145e1b878013cdca62a58ce7ce29dce60fa753b00103705fea1c79af5be2174a7839d137fc7f4ad0ea231208b874dfd04f5f6'; @@ -452,8 +452,8 @@ export const addressUtxoSet = `[ } ]`; export const expectedAdressUtxoSet = [ - '{"txId":"4eb16141fb4f2ca1cabc0dfb16491e54a1b4464b75591ccc3942eb4c6f4273fb","index":0,"value":1344798,"assets":[{"policy_id":"0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47","asset_name":"5273455247","quantity":64576047,"fingerprint":"asset1p40r0eun2alszlxhj7k4uylya4cj54lxkjjmsm"}]}', - '{"txId":"dbd93ef240f7546ce6b8619b6bea4486252bdeaae89d4ee9f74a6fa363d4eb22","index":0,"value":1344798,"assets":[{"policy_id":"0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47","asset_name":"5273455247","quantity":57617503,"fingerprint":"asset1p40r0eun2alszlxhj7k4uylya4cj54lxkjjmsm"}]}', + '{"txId":"4eb16141fb4f2ca1cabc0dfb16491e54a1b4464b75591ccc3942eb4c6f4273fb","index":0,"value":1344798,"assets":[{"policy_id":"0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47","asset_name":"5273455247","quantity":64576047}]}', + '{"txId":"dbd93ef240f7546ce6b8619b6bea4486252bdeaae89d4ee9f74a6fa363d4eb22","index":0,"value":1344798,"assets":[{"policy_id":"0dad352d8f0d5ce3f5be8b025d6a16141ecceab5a921871792d91f47","asset_name":"5273455247","quantity":57617503}]}', '{"txId":"454426c78db02b32a02274d926850fad261bb08b3dbfac962ba38c5118856dc6","index":0,"value":1260649,"assets":[]}', ]; diff --git a/packages/networks/ergo-explorer/package.json b/packages/networks/ergo-explorer/package.json index 6a06fb7..51a0aa3 100644 --- a/packages/networks/ergo-explorer/package.json +++ b/packages/networks/ergo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/ergo-explorer-network", - "version": "2.3.4", + "version": "3.0.0", "description": "ergo explorer network package for rosen ergo chain", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", @@ -22,10 +22,10 @@ "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/ergo": "^2.3.3", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/ergo": "^3.0.0", "@rosen-clients/ergo-explorer": "^1.0.3", "ergo-lib-wasm-nodejs": "^0.24.1", "it-all": "^3.0.1" diff --git a/packages/networks/ergo-node/package.json b/packages/networks/ergo-node/package.json index a969a18..c101200 100644 --- a/packages/networks/ergo-node/package.json +++ b/packages/networks/ergo-node/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-chains/ergo-node-network", - "version": "2.3.4", + "version": "3.0.0", "description": "ergo node network package for rosen ergo chain", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", @@ -22,10 +22,10 @@ "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^1.0.2", + "@rosen-bridge/rosen-extractor": "^2.0.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^2.2.2", - "@rosen-chains/ergo": "^2.3.3", + "@rosen-chains/abstract-chain": "^3.0.0", + "@rosen-chains/ergo": "^3.0.0", "@rosen-clients/ergo-node": "^1.0.4", "ergo-lib-wasm-nodejs": "^0.24.1", "it-all": "^3.0.1"