Skip to content

Commit

Permalink
feat(core): partial support for legacy base58 addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
mkazlauskas committed Jan 18, 2022
1 parent 1316d4b commit 0f4cb28
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 13 deletions.
1 change: 1 addition & 0 deletions packages/core/src/CSL/coreToCsl.ts
Expand Up @@ -58,6 +58,7 @@ export const txIn = (core: Cardano.TxIn): TransactionInput =>
TransactionInput.new(TransactionHash.from_bytes(Buffer.from(core.txId, 'hex')), core.index);

export const txOut = (core: Cardano.TxOut): TransactionOutput =>
// TODO: add support for base 58 addresses
TransactionOutput.new(Address.from_bech32(core.address.toString()), value(core.value));

export const utxo = (core: Cardano.Utxo[]): TransactionUnspentOutput[] =>
Expand Down
15 changes: 11 additions & 4 deletions packages/core/src/Cardano/types/Address.ts
@@ -1,13 +1,20 @@
import * as util from '../util';
import * as typesUtil from '../util';
import { InvalidStringError } from '../..';
import { util as addressUtil } from '../../Address';

/**
* mainnet or testnet address as bech32 string, consisting of
* network tag, payment credential and optional stake credential
*/
export type Address = util.OpaqueString<'Address'>;
export type Address = typesUtil.OpaqueString<'Address'>;

/**
* @param {string} value mainnet or testnet address as bech32 string
* @param {string} value mainnet or testnet address
* @throws InvalidStringError
*/
export const Address = (value: string): Address => util.typedBech32(value, ['addr', 'addr_test'], [47, 92]);
export const Address = (value: string): Address => {
if (addressUtil.isAddress(value)) {
return value as unknown as Address;
}
throw new InvalidStringError(`Invalid address: ${value}`);
};
16 changes: 7 additions & 9 deletions packages/core/test/Cardano/types/Address.test.ts
@@ -1,25 +1,23 @@
import { Cardano } from '../../../src';

jest.mock('../../../src/Cardano/util/primitives', () => {
const actual = jest.requireActual('../../../src/Cardano/util/primitives');
// eslint-disable-next-line sonarjs/no-duplicate-string
jest.mock('../../../src/Address/util', () => {
const actual = jest.requireActual('../../../src/Address/util');
return {
typedBech32: jest.fn().mockImplementation((...args) => actual.typedBech32(...args))
isAddress: jest.fn().mockImplementation((...args) => actual.isAddress(...args))
};
});
const addressUtilMock = jest.requireMock('../../../src/Address/util');

describe('Cardano/types/Address', () => {
afterEach(() => (Cardano.util.typedBech32 as jest.Mock).mockReset());

it('Address() accepts a valid mainnet grouped address and is implemented using util.typedBech32', () => {
expect(() =>
Cardano.Address(
'addr1qx52knza2h5x090n4a5r7yraz3pwcamk9ppvuh7e26nfks7pnmhxqavtqy02zezklh27jt9r6z62sav3mugappdc7xnskxy2pn'
)
).not.toThrow();
expect(Cardano.util.typedBech32).toBeCalledWith(
'addr1qx52knza2h5x090n4a5r7yraz3pwcamk9ppvuh7e26nfks7pnmhxqavtqy02zezklh27jt9r6z62sav3mugappdc7xnskxy2pn',
['addr', 'addr_test'],
[47, 92]
expect(addressUtilMock.isAddress).toBeCalledWith(
'addr1qx52knza2h5x090n4a5r7yraz3pwcamk9ppvuh7e26nfks7pnmhxqavtqy02zezklh27jt9r6z62sav3mugappdc7xnskxy2pn'
);
});

Expand Down

0 comments on commit 0f4cb28

Please sign in to comment.