Skip to content

Commit

Permalink
refactor(cip2): use AssetSerializer from core package
Browse files Browse the repository at this point in the history
  • Loading branch information
mkazlauskas committed Sep 23, 2021
1 parent c11ad17 commit dc25a5c
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 52 deletions.
44 changes: 5 additions & 39 deletions packages/cip2/src/util.ts
@@ -1,13 +1,7 @@
// TODO: move all of these utils to core package
import { CardanoSerializationLib } from '@cardano-sdk/cardano-serialization-lib';
import { Asset, BigIntMath } from '@cardano-sdk/core';
import {
AssetName,
ScriptHash,
TransactionOutput,
TransactionOutputs,
Value
} from '@emurgo/cardano-serialization-lib-nodejs';
import { TransactionOutput, TransactionOutputs, Value } from '@emurgo/cardano-serialization-lib-nodejs';
import { Value as OgmiosValue } from '@cardano-ogmios/schema';

/**
Expand All @@ -33,38 +27,10 @@ export const transactionOutputsToArray = (outputs: TransactionOutputs): Transact
return result;
};

export const createAssetSerializer = (csl: CardanoSerializationLib) => {
const bech32Prefix = 'b32_';
const encoder = new TextEncoder();
const decoder = new TextDecoder();
return {
/**
* Combine script hash and asset name into unique asset identifier.
* Operation can be reversed with *parse(assetId)*
*/
createId: (scriptHash: ScriptHash, assetName: AssetName): string =>
// TODO: I suggest to move this to @cardano-sdk/core so it's together with
// policyIdFromAssetId and assetNameFromAssetId, because it's
// relying on bech32 length and it can have different length prefix.
scriptHash.to_bech32(bech32Prefix) + decoder.decode(assetName.name()),
/**
* Get asset scripthash bech32 and asset name
* from id created by *create(scriptHashBech32, assetName)*.
*/
parseId: (id: string) => {
const scriptHashBech32 = Asset.util.policyIdFromAssetId(id);
const assetName = Asset.util.assetNameFromAssetId(id);
return {
scriptHash: csl.ScriptHash.from_bech32(scriptHashBech32),
assetName: csl.AssetName.new(encoder.encode(assetName))
};
}
};
};

export type AssetSerializer = ReturnType<typeof createAssetSerializer>;

export const createCslUtils = (csl: CardanoSerializationLib, assetSerializer = createAssetSerializer(csl)) => {
export const createCslUtils = (
csl: CardanoSerializationLib,
assetSerializer = Asset.util.createAssetSerializer(csl)
) => {
const valueToValueQuantities = (value: Value): ValueQuantities => {
const result: ValueQuantities = {
coins: BigInt(value.coin().to_str())
Expand Down
5 changes: 4 additions & 1 deletion packages/cip2/test/tsconfig.json
Expand Up @@ -6,5 +6,8 @@
"@src/*": ["../src/*"]
}
},
"references": [{ "path": "../src" }]
"references": [
{ "path": "../src" },
{ "path": "../../cardano-serialization-lib/src" }
]
}
15 changes: 3 additions & 12 deletions packages/cip2/test/util.test.ts
@@ -1,9 +1,8 @@
import { CardanoSerializationLib, loadCardanoSerializationLib } from '@cardano-sdk/cardano-serialization-lib';
import { Asset } from '@cardano-sdk/core';
import {
AssetSerializer,
coalesceValueQuantities,
computeMinUtxoValue,
createAssetSerializer,
createCslUtils,
CslUtils,
transactionOutputsToArray,
Expand All @@ -15,23 +14,15 @@ describe('util', () => {
let CSL: CardanoSerializationLib;
let cslUtils: CslUtils;
let testUtils: TestUtils;
let assetSerializer: AssetSerializer;
let assetSerializer: Asset.util.AssetSerializer;
beforeAll(async () => {
CSL = await loadCardanoSerializationLib();
assetSerializer = createAssetSerializer(CSL);
assetSerializer = Asset.util.createAssetSerializer(CSL);
cslUtils = createCslUtils(CSL, assetSerializer);
testUtils = createCslTestUtils(CSL);
});

describe('createCslUtils', () => {
it('createAssetSerializer', () => {
const serializer = createAssetSerializer(CSL);
const tsla = serializer.parseId(TSLA_Asset);
expect(new TextDecoder().decode(tsla.assetName.name())).toEqual('TSLA');
expect(tsla.scriptHash.to_bech32('b32_')).toEqual('b32_1vk0jj9lmv0cjkvmxw337u467atqcgkauwd4eczaugzagyghp25l');
expect(serializer.createId(tsla.scriptHash, tsla.assetName)).toEqual(TSLA_Asset);
});

describe('valueQuantitiesToValue', () => {
it('coin only', () => {
const quantities = { coins: 100_000n };
Expand Down

0 comments on commit dc25a5c

Please sign in to comment.