Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "adamant-api",
"version": "2.2.0",
"version": "2.3.0",
"description": "JavaScript API library for the ADAMANT Blockchain",
"keywords": [
"adm",
Expand Down Expand Up @@ -47,7 +47,6 @@
"scripts": {
"test": "jest",
"lint": "gts lint",
"preinstall": "npx only-allow pnpm",
"prepare": "husky install",
"clean": "gts clean",
"compile": "tsc",
Expand Down
34 changes: 22 additions & 12 deletions src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,11 @@ import {
createVoteTransaction,
} from '../helpers/transactions';
import {encodeMessage} from '../helpers/encryptor';
import {VoteDirection, parseVote} from './votes';
import {
type VoteDirection,
transformTransactionQuery,
parseVote,
} from './utils';

export type AdamantAddress = `U${string}`;

Expand All @@ -99,9 +103,9 @@ export type AddressOrPublicKeyObject = AddressObject | PublicKeyObject;
*/
export type UsernameOrPublicKeyObject = UsernameObject | PublicKeyObject;

export type TransactionQuery<T extends {}> = T & {
or: T;
and: T;
export type TransactionQuery<T extends object> = Partial<T> & {
or?: Partial<T>;
and?: Partial<T>;
};

export interface GetBlocksOptions {
Expand Down Expand Up @@ -571,7 +575,10 @@ export class AdamantApi extends NodeManager {
address: string,
options?: TransactionQuery<ChatroomsOptions>
) {
return this.get<GetChatRoomsResponseDto>(`chatrooms/${address}`, options);
return this.get<GetChatRoomsResponseDto>(
`chatrooms/${address}`,
transformTransactionQuery(options)
);
}

/**
Expand All @@ -584,7 +591,7 @@ export class AdamantApi extends NodeManager {
) {
return this.get<GetChatMessagesResponseDto>(
`chatrooms/${address1}/${address2}`,
query
transformTransactionQuery(query)
);
}

Expand Down Expand Up @@ -778,19 +785,22 @@ export class AdamantApi extends NodeManager {
* Returns list of transactions
*/
async getTransactions(options?: TransactionQuery<TransactionsOptions>) {
return this.get<GetTransactionsResponseDto>('transactions', options);
return this.get<GetTransactionsResponseDto>(
'transactions',
transformTransactionQuery(options)
);
}

/**
* Get transaction by ID
*/
async getTransaction(
id: number,
id: string,
options?: TransactionQuery<TransactionsOptions>
) {
return this.get<GetTransactionByIdResponseDto>('transactions/get', {
id,
...options,
...transformTransactionQuery(options),
});
}

Expand All @@ -813,7 +823,7 @@ export class AdamantApi extends NodeManager {
/**
* Get queued transaction by ID
*/
async getQueuedTransaction(id: number) {
async getQueuedTransaction(id: string) {
return this.get<GetQueuedTransactionsResponseDto>(
'transactions/queued/get',
{id}
Expand All @@ -832,7 +842,7 @@ export class AdamantApi extends NodeManager {
/**
* Get unconfirmed transaction by ID
*/
async getUnconfirmedTransaction(id: number) {
async getUnconfirmedTransaction(id: string) {
return this.get<GetUnconfirmedTransactionByIdResponseDto>(
'transactions/unconfirmed/get',
{id}
Expand All @@ -841,4 +851,4 @@ export class AdamantApi extends NodeManager {
}

export * from './generated';
export * from './votes';
export * from './utils';
89 changes: 89 additions & 0 deletions src/api/tests/utils.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import {transformTransactionQuery} from '../utils';

describe('transformTransactionQuery', () => {
it('should transform `or` and `and` object properties', () => {
const transformed = transformTransactionQuery({
or: {
maxAmount: 50000000,
senderPublicKey:
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
senderPublicKeys: [
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
'4ef885053c630041f57493343d7f6023107c5dc8b8148147e732c93',
],
},
and: {
blockId: '7917597195203393333',
fromHeight: 10336065,
toHeight: 11,
minAmount: 1000000000000001,
senderId: 'U15423595369615486571',
senderIds: ['U18132012621449491414', 'U15881344309699504778'],
recipientId: 'U15423595369615486571',
recipientIds: ['U18132012621449491414', 'U15881344309699504778'],
recipientPublicKey:
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
recipientPublicKeys: [
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
'4ef885053c630041f57493343d7f6023107c5dc8b8148147e732c93',
],
inId: 'U100739400829575109',
type: 2,
types: [9, 0],
key: 'eth:address',
keyIds: ['eth:address', 'doge:address', 'dash:address'],
},
});

expect(transformed).toStrictEqual({
'or:maxAmount': 50000000,
'or:senderPublicKey':
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
'or:senderPublicKeys': [
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
'4ef885053c630041f57493343d7f6023107c5dc8b8148147e732c93',
],
'and:blockId': '7917597195203393333',
'and:fromHeight': 10336065,
'and:toHeight': 11,
'and:minAmount': 1000000000000001,
'and:senderId': 'U15423595369615486571',
'and:senderIds': ['U18132012621449491414', 'U15881344309699504778'],
'and:recipientId': 'U15423595369615486571',
'and:recipientIds': ['U18132012621449491414', 'U15881344309699504778'],
'and:recipientPublicKey':
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
'and:recipientPublicKeys': [
'801846655523f5e21f2d454b2f98f70aaf5d3887c806463100a1764a4e7c1457',
'4ef885053c630041f57493343d7f6023107c5dc8b8148147e732c93',
],
'and:inId': 'U100739400829575109',
'and:type': 2,
'and:types': [9, 0],
'and:key': 'eth:address',
'and:keyIds': ['eth:address', 'doge:address', 'dash:address'],
});
});

it('should NOT transform object properties other than `or` and `and`', () => {
const transformed = transformTransactionQuery({
minAmount: 5000,
senderId: 'U15423595369615486571',
senderIds: ['U18132012621449491414', 'U15881344309699504778'],
and: {
maxAmount: 6000,
},
or: {
recipientIds: ['U18132012621449491414', 'U15881344309699504778'],
},
});

expect(transformed).toStrictEqual({
minAmount: 5000,
senderId: 'U15423595369615486571',
senderIds: ['U18132012621449491414', 'U15881344309699504778'],
'and:maxAmount': 6000,
'or:recipientIds': ['U18132012621449491414', 'U15881344309699504778'],
});
});
});
42 changes: 42 additions & 0 deletions src/api/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import {hasOwnProperty} from '../helpers/utils';
import {TransactionQuery} from '.';

export type VoteDirection = '+' | '-';

export const parseVote = (vote: string): [string, VoteDirection] => {
const name = vote.slice(1);
const direction = vote.charAt(0);

return [name, direction as VoteDirection];
};

export const transformTransactionQuery = <T extends object>(
obj?: TransactionQuery<T>
) => {
if (!obj) {
return {};
}

const transformed: Record<string, unknown> = {
...obj,
};

for (const topLevelProp in obj) {
if (hasOwnProperty(obj, topLevelProp)) {
if (topLevelProp === 'or' || topLevelProp === 'and') {
const subProps = obj[topLevelProp];

for (const subProp in subProps) {
if (hasOwnProperty(subProps, subProp)) {
const newKey = `${topLevelProp}:${subProp}`;
transformed[newKey] = subProps[subProp];
}
}

delete transformed[topLevelProp];
}
}
}

return transformed;
};
8 changes: 0 additions & 8 deletions src/api/votes.ts

This file was deleted.

6 changes: 6 additions & 0 deletions src/helpers/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export const hasOwnProperty = <T extends object, K extends PropertyKey>(
obj: T,
prop: K
): obj is T & Record<K, unknown> => {
return Object.prototype.hasOwnProperty.call(obj, prop);
};