Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

solution: update api-definitions, move address method to address-api,… #34

Merged
merged 1 commit into from
Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,7 @@ export {
publishToPromise,
} from './Publisher';
export { AlwaysRepeat, ContinueCheck, OnceSuccess, Retry } from './Retry';
export {
ConvertDescribeAddress,
DescribeAddressCapability,
DescribeAddressControl,
DescribeAddressRequest,
DescribeAddressResponse,
} from './typesAddress';
export * as address from './typesAddress';
export {
AddressBalance,
BalanceRequest,
Expand Down Expand Up @@ -71,5 +65,5 @@ export {
StablecoinCurrency,
TestCurrency,
} from './typesMarket';
export * as transaction from './typesTransaction';
export * as token from './typesToken';
export * as transaction from './typesTransaction';
71 changes: 48 additions & 23 deletions packages/core/src/typesAddress.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,42 @@
import { AddressCapability, DescribeRequest, DescribeResponse } from './generated/address.message_pb';
import * as address_message_pb from './generated/address.message_pb';
import { DataMapper } from './Publisher';
import { Blockchain, ConvertCommon, SingleAddress } from './typesCommon';
import { Blockchain, ConvertCommon, SingleAddress, XpubAddress } from './typesCommon';
import { MessageFactory } from './typesConvert';

export enum DescribeAddressCapability {
export enum AddressCapability {
ERC20 = 'erc20',
}

export enum DescribeAddressControl {
export enum AddressControl {
CONTRACT = 'contract',
PERSON = 'person',
}

export interface DescribeAddressRequest {
export interface DescribeRequest {
address: SingleAddress;
chain: Blockchain;
blockchain: Blockchain;
}

export interface DescribeAddressResponse {
export interface DescribeResponse {
active: boolean;
address: SingleAddress;
capabilities: DescribeAddressCapability[];
control?: DescribeAddressControl;
capabilities: AddressCapability[];
control?: AddressControl;
}

export class ConvertDescribeAddress {
export interface DescribeXpubRequest {
blockchain: Blockchain;
address: XpubAddress;
}

export interface DescribeXpubResponse {
blockchain: Blockchain;
address: XpubAddress;
lastAddress?: SingleAddress;
lastIndex?: number;
}

export class ConvertAddress {
private readonly factory: MessageFactory;
private readonly common: ConvertCommon;

Expand All @@ -33,13 +45,12 @@ export class ConvertDescribeAddress {
this.common = common;
}

addressRequest({ address, chain }: DescribeAddressRequest): DescribeRequest {
const result: DescribeRequest = this.factory('address_message_pb.DescribeRequest');

return result.setAddress(this.common.pbSingleAddress(address)).setChain(chain.valueOf());
describeRequest({ address, blockchain }: DescribeRequest): address_message_pb.DescribeRequest {
const result: address_message_pb.DescribeRequest = this.factory('address_message_pb.DescribeRequest');
return result.setAddress(this.common.pbSingleAddress(address)).setChain(blockchain.valueOf());
}

addressResponse(): DataMapper<DescribeResponse, DescribeAddressResponse> {
describeResponse(): DataMapper<address_message_pb.DescribeResponse, DescribeResponse> {
return (response) => ({
active: response.getActive(),
address: response.getAddress().getAddress(),
Expand All @@ -51,21 +62,35 @@ export class ConvertDescribeAddress {
});
}

private convertAddressCapability(capability: AddressCapability): DescribeAddressCapability | undefined {
public describeXpubRequest(req: DescribeXpubRequest): address_message_pb.DescribeXpubRequest {
const result: address_message_pb.DescribeXpubRequest = this.factory('address_message_pb.DescribeXpubRequest');
return result.setChain(req.blockchain.valueOf()).setAddress(this.common.pbXpubAddress(req.address));
}

public describeXpubResponse(): DataMapper<address_message_pb.DescribeXpubResponse, DescribeXpubResponse> {
return (response) => ({
blockchain: response.getChain().valueOf(),
address: response.getAddress().getXpub(),
lastAddress: response.hasLastAddress() ? response.getLastAddress().getAddress() : undefined,
lastIndex: response.hasLastIndex() ? response.getLastIndex().getValue() : undefined,
});
}

private convertAddressCapability(capability: address_message_pb.AddressCapability): AddressCapability | undefined {
switch (capability) {
case AddressCapability.CAP_ERC20:
return DescribeAddressCapability.ERC20;
case address_message_pb.AddressCapability.CAP_ERC20:
return AddressCapability.ERC20;
default:
return undefined;
}
}

private convertAddressControl(control: DescribeResponse.AddrControl): DescribeAddressControl | undefined {
private convertAddressControl(control: address_message_pb.AddressControl): AddressControl | undefined {
switch (control) {
case DescribeResponse.AddrControl.CTRL_CONTRACT:
return DescribeAddressControl.CONTRACT;
case DescribeResponse.AddrControl.CTRL_PERSON:
return DescribeAddressControl.PERSON;
case address_message_pb.AddressControl.CTRL_CONTRACT:
return AddressControl.CONTRACT;
case address_message_pb.AddressControl.CTRL_PERSON:
return AddressControl.PERSON;
default:
return undefined;
}
Expand Down
84 changes: 2 additions & 82 deletions packages/core/src/typesTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ import * as transaction_message_pb from './generated/transaction.message_pb';
import { DataMapper } from './Publisher';
import {
AnyAddress,
Asset,
BlockInfo,
Blockchain,
ConvertCommon,
SingleAddress,
XpubAddress,
} from './typesCommon';
import { MessageFactory } from './typesConvert';

Expand All @@ -21,29 +19,6 @@ export enum ChangeType {
FEE = 1,
}

export type BalanceRequest = {
asset: Asset;
address: AnyAddress;
};

export interface BalanceResponse {
asset: Asset;
address: SingleAddress[];
balance: string;
}

export type XpubStateRequest = {
blockchain: Blockchain;
address: XpubAddress;
};

export interface XpubState {
blockchain: Blockchain;
address: XpubAddress;
lastAddress?: SingleAddress;
lastIndex?: number;
}

export interface GetTransactionsRequest {
blockchain: Blockchain;
address: AnyAddress;
Expand Down Expand Up @@ -97,31 +72,7 @@ export interface Change {
xpubIndex?: number;
}

export interface GenericTransfer {
direction: Direction;
/** unsigned amount */
amount: string;
/** indexes of counterparty addresses in xpub if xpub has been requested if detected */
xpubIndexes: number[];
}

export interface EthereumTransfer extends GenericTransfer {
/** unsigned fee amount */
fee: string;
/** counterparty address */
address: SingleAddress;
/** e.g. ERC-20 token address, optional, undefined for blockchain native token */
contractAddress?: string;
}

export interface BitcoinTransfer extends GenericTransfer {
/** counterparty address or self address for change */
addressAmounts: AddressAmount[];
}

export type AnyTransfer = GenericTransfer | EthereumTransfer | BitcoinTransfer;

export class Convert {
export class ConvertTransaction {
private readonly factory: MessageFactory;
private readonly common: ConvertCommon;

Expand All @@ -130,37 +81,6 @@ export class Convert {
this.common = common;
}

public balanceRequest(req: BalanceRequest): transaction_message_pb.BalanceRequest {
const result: transaction_message_pb.BalanceRequest = this.factory('transaction_message_pb.BalanceRequest');
return result.setAsset(this.common.pbAsset(req.asset)).setAddress(this.common.pbAnyAddress(req.address));
}

public balanceResponse(): DataMapper<transaction_message_pb.BalanceResponse, BalanceResponse> {
return (resp) => {
return {
asset: this.common.asset(resp.getAsset()),
address: resp.getAddressList()?.map((value) => value.getAddress()),
balance: resp.getBalance(),
};
};
}

public xpubStateRequest(req: XpubStateRequest): transaction_message_pb.XpubStateRequest {
const result: transaction_message_pb.XpubStateRequest = this.factory('transaction_message_pb.XpubStateRequest');
return result.setBlockchain(req.blockchain.valueOf()).setAddress(this.common.pbXpubAddress(req.address));
}

public xpubState(): DataMapper<transaction_message_pb.XpubState, XpubState> {
return (resp) => {
return {
blockchain: resp.getBlockchain().valueOf(),
address: resp.getAddress().getXpub(),
lastAddress: resp.hasLastAddress() ? resp.getLastAddress().getAddress() : undefined,
lastIndex: resp.hasLastIndex() ? resp.getLastIndex().getValue() : undefined,
};
};
}

public getTransactionsRequest(req: GetTransactionsRequest): transaction_message_pb.GetTransactionsRequest {
const result: transaction_message_pb.GetTransactionsRequest = this.factory('transaction_message_pb.GetTransactionsRequest');
return result
Expand Down Expand Up @@ -198,7 +118,7 @@ export class Convert {
}

const blockchain = resp.getChain().valueOf();
const changes = resp.getChangesList().map((value) => Convert.change(value));
const changes = resp.getChangesList().map((value) => ConvertTransaction.change(value));
const cursor = resp.getCursor();
const mempool = resp.getMempool();
const xpubIndex = resp.hasXpubIndex() ? resp.getXpubIndex().getValue() : undefined;
Expand Down
35 changes: 28 additions & 7 deletions packages/node/src/__integration-tests__/address.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Blockchain, DescribeAddressControl } from '@emeraldpay/api';
import { Blockchain, address } from '@emeraldpay/api';
import { EmeraldApi } from '../EmeraldApi';

jest.setTimeout(15000);
Expand All @@ -13,22 +13,43 @@ describe('AddressClient', () => {
test('describe contract address', async () => {
const client = api.address();

const description = await client.describeAddress({
const description = await client.describe({
address: '0x7EA2be2df7BA6E54B1A9C70676f668455E329d29',
chain: Blockchain.ETHEREUM,
blockchain: Blockchain.ETHEREUM,
});

expect(description.control).toEqual(DescribeAddressControl.CONTRACT);
expect(description.control).toEqual(address.AddressControl.CONTRACT);
});

test('describe person address', async () => {
const client = api.address();

const description = await client.describeAddress({
const description = await client.describe({
address: '0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE',
chain: Blockchain.ETHEREUM,
blockchain: Blockchain.ETHEREUM,
});

expect(description.control).toEqual(DescribeAddressControl.PERSON);
expect(description.control).toEqual(address.AddressControl.PERSON);
});

test('DescribeXpub', (done) => {
const client = api.address();

client
.describeXpub({
address:
'vpub5bGr72An7v5pmqBZecLVnd74Kpip5t9GSPX7ULe9LazdvWq1ECkJ' +
'Tpsf6YGFcD4T1McCvcaVdmuHZoo1qaNsddqREiheeFfzUuJ1vMjLFWE',
blockchain: Blockchain.TESTNET_BITCOIN,
})
.then(({ address }) => {
expect(address).toEqual(
'vpub5bGr72An7v5pmqBZecLVnd74Kpip5t9GSPX7ULe9LazdvWq1ECkJ' +
'Tpsf6YGFcD4T1McCvcaVdmuHZoo1qaNsddqREiheeFfzUuJ1vMjLFWE',
);

done();
})
.catch((error) => done(error));
});
});
14 changes: 7 additions & 7 deletions packages/node/src/__integration-tests__/auth.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe('Auth', () => {
const blockchainClient = api.blockchain();
const marketClient = api.market();
const monitoringClient = api.monitoring();
const transactionClient = api.transaction();
const addressClient = api.address();

const results = await Promise.all([
blockchainClient.estimateFees({
Expand All @@ -48,7 +48,7 @@ describe('Auth', () => {
}),
marketClient.getRates([{ base: 'ETH', target: 'USD' }]),
monitoringClient.ping(),
transactionClient.getXpubState({
addressClient.describeXpub({
address:
'vpub5bGr72An7v5pmqBZecLVnd74Kpip5t9GSPX7ULe9LazdvWq1ECkJ' +
'Tpsf6YGFcD4T1McCvcaVdmuHZoo1qaNsddqREiheeFfzUuJ1vMjLFWE',
Expand All @@ -63,16 +63,16 @@ describe('Auth', () => {
const blockchainMetadata = await blockchainClient.credentials._getCallCredentials().generateMetadata(options);
const marketMetadata = await marketClient.credentials._getCallCredentials().generateMetadata(options);
const monitoringMetadata = await monitoringClient.credentials._getCallCredentials().generateMetadata(options);
const transactionMetadata = await transactionClient.credentials._getCallCredentials().generateMetadata(options);
const addressMetadata = await addressClient.credentials._getCallCredentials().generateMetadata(options);

const [blockchainAuthorization] = blockchainMetadata.get('authorization');
const [marketAuthorization] = marketMetadata.get('authorization');
const [monitoringAuthorization] = monitoringMetadata.get('authorization');
const [transactionAuthorization] = transactionMetadata.get('authorization');
const [addressAuthorization] = addressMetadata.get('authorization');

expect(blockchainAuthorization).toEqual(marketAuthorization);
expect(marketAuthorization).toEqual(monitoringAuthorization);
expect(monitoringAuthorization).toEqual(transactionAuthorization);
expect(monitoringAuthorization).toEqual(addressAuthorization);
});

test('token awaiting stopped in other clients when first request failed', async () => {
Expand All @@ -94,7 +94,7 @@ describe('Auth', () => {
const blockchainClient = api.blockchain();
const marketClient = api.market();
const monitoringClient = api.monitoring();
const transactionClient = api.transaction();
const addressClient = api.address();

try {
const results = await Promise.all([
Expand All @@ -105,7 +105,7 @@ describe('Auth', () => {
}),
marketClient.getRates([{ base: 'ETH', target: 'USD' }]),
monitoringClient.ping(),
transactionClient.getXpubState({
addressClient.describeXpub({
address:
'vpub5bGr72An7v5pmqBZecLVnd74Kpip5t9GSPX7ULe9LazdvWq1ECkJ' +
'Tpsf6YGFcD4T1McCvcaVdmuHZoo1qaNsddqREiheeFfzUuJ1vMjLFWE',
Expand Down
Loading
Loading