Skip to content

Commit 1d9d0a6

Browse files
authored
fix: /v2/addresses/{addr}/transactions incorrect when address only involved with token events (#2033)
* fix: `/v2/addresses/{addr}/transactions` incorrect when address only involved with token events * docs: specify recommended alternative endpoints in deprecated `/extended/v1/address/*` endpoints
1 parent 815c16f commit 1d9d0a6

File tree

3 files changed

+68
-9
lines changed

3 files changed

+68
-9
lines changed

docs/openapi.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,9 +1938,11 @@ paths:
19381938
get:
19391939
summary: Get account transactions
19401940
description: |
1941-
Retrieves a list of all Transactions for a given Address or Contract Identifier. More information on Transaction types can be found [here](https://docs.stacks.co/understand-stacks/transactions#types).
1941+
**NOTE:** This endpoint is deprecated in favor of [Get address transactions](/api/get-address-transactions).
19421942
1943-
If you need to actively monitor new transactions for an address or contract id, we highly recommend subscribing to [WebSockets or Socket.io](https://github.com/hirosystems/stacks-blockchain-api/tree/master/client) for real-time updates.
1943+
Retrieves a list of all Transactions for a given Address or Contract Identifier. More information on Transaction types can be found [here](https://docs.stacks.co/understand-stacks/transactions#types).
1944+
1945+
If you need to actively monitor new transactions for an address or contract id, we highly recommend subscribing to [WebSockets or Socket.io](https://github.com/hirosystems/stacks-blockchain-api/tree/master/client) for real-time updates.
19441946
deprecated: true
19451947
tags:
19461948
- Accounts
@@ -2002,7 +2004,10 @@ paths:
20022004
/extended/v1/address/{principal}/{tx_id}/with_transfers:
20032005
get:
20042006
summary: Get account transaction information for specific transaction
2005-
description: Retrieves transaction details for a given Transaction Id `tx_id`, for a given account or contract Identifier.
2007+
description: |
2008+
**NOTE:** This endpoint is deprecated in favor of [Get events for an address transaction](/api/get-address-transaction-events).
2009+
2010+
Retrieves transaction details for a given Transaction Id `tx_id`, for a given account or contract Identifier.
20062011
deprecated: true
20072012
tags:
20082013
- Accounts

src/datastore/pg-store-v2.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,6 @@ export class PgStoreV2 extends BasePgStoreModule {
417417
args: AddressParams & TransactionPaginationQueryParams
418418
): Promise<DbPaginatedResult<DbTxWithAddressTransfers>> {
419419
return await this.sqlTransaction(async sql => {
420-
await assertAddressExists(sql, args.address);
421420
const limit = args.limit ?? TransactionLimitParamSchema.default;
422421
const offset = args.offset ?? 0;
423422

@@ -461,7 +460,12 @@ export class PgStoreV2 extends BasePgStoreModule {
461460
SELECT COALESCE(SUM(amount), 0)
462461
FROM stx_events
463462
WHERE ${eventCond} AND sender = ${args.address}
464-
) + txs.fee_rate AS stx_sent,
463+
) +
464+
CASE
465+
WHEN (txs.sponsored = false AND txs.sender_address = ${args.address})
466+
OR (txs.sponsored = true AND txs.sponsor_address = ${args.address})
467+
THEN txs.fee_rate ELSE 0
468+
END AS stx_sent,
465469
(
466470
SELECT COALESCE(SUM(amount), 0)
467471
FROM stx_events
@@ -526,7 +530,6 @@ export class PgStoreV2 extends BasePgStoreModule {
526530
args: AddressTransactionParams & TransactionPaginationQueryParams
527531
): Promise<DbPaginatedResult<DbAddressTransactionEvent>> {
528532
return await this.sqlTransaction(async sql => {
529-
await assertAddressExists(sql, args.address);
530533
await assertTxIdExists(sql, args.tx_id);
531534
const limit = args.limit ?? TransactionLimitParamSchema.default;
532535
const offset = args.offset ?? 0;

src/tests/address-tests.ts

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ describe('address tests', () => {
6969
const testAddr2 = 'ST1HB64MAJ1MBV4CQ80GF01DZS4T1DSMX20ADCRA4';
7070
const testContractAddr = 'ST27W5M8BRKA7C5MZE2R1S1F4XTPHFWFRNHA9M04Y.hello-world';
7171
const testAddr4 = 'ST3DWSXBPYDB484QXFTR81K4AWG4ZB5XZNFF3H70C';
72+
const testAddr5 = 'ST29H5FH57AZVJSBWHCTJB5ATS2ZAH9SXN1XJDNK';
7273
const testTxId = '0x03807fdb726b3cb843e0330c564a4974037be8f9ea58ec7f8ebe03c34b890009';
7374

7475
const block: DbBlock = {
@@ -208,6 +209,23 @@ describe('address tests', () => {
208209
createStxTx(testContractAddr, testAddr4, 15, true, 1, 1, 0),
209210
createStxTx(testAddr2, testAddr4, 35, true, 3, 1, 2),
210211
];
212+
213+
const tx1 = txs[0];
214+
const addr3FtEvent: DbFtEvent = {
215+
canonical: true,
216+
event_type: DbEventTypeId.FungibleTokenAsset,
217+
asset_event_type_id: DbAssetEventTypeId.Transfer,
218+
asset_identifier: 'usdc',
219+
event_index: 1234,
220+
tx_id: tx1[0].tx_id,
221+
tx_index: tx1[0].tx_index,
222+
block_height: tx1[0].block_height,
223+
amount: BigInt(12345),
224+
recipient: testAddr5,
225+
sender: 'STEH21DTN67ECXDRXG858XHBZMEBEBFE2FV79DEF',
226+
};
227+
tx1[2].push(addr3FtEvent);
228+
211229
await db.update({
212230
block: block,
213231
microblocks: [],
@@ -536,7 +554,7 @@ describe('address tests', () => {
536554
mint: 0,
537555
burn: 0,
538556
});
539-
expect(v2Fetch1Json.results[4].stx_sent).toBe('1234');
557+
expect(v2Fetch1Json.results[4].stx_sent).toBe('0');
540558
expect(v2Fetch1Json.results[4].stx_received).toBe('0');
541559
expect(v2Fetch1Json.results[4].events.stx).toStrictEqual({
542560
transfer: 0,
@@ -553,7 +571,7 @@ describe('address tests', () => {
553571
mint: 0,
554572
burn: 0,
555573
});
556-
expect(v2Fetch1Json.results[5].stx_sent).toBe('1234');
574+
expect(v2Fetch1Json.results[5].stx_sent).toBe('0');
557575
expect(v2Fetch1Json.results[5].stx_received).toBe('0');
558576
expect(v2Fetch1Json.results[5].events.stx).toStrictEqual({
559577
transfer: 0,
@@ -570,7 +588,7 @@ describe('address tests', () => {
570588
mint: 0,
571589
burn: 0,
572590
});
573-
expect(v2Fetch1Json.results[6].stx_sent).toBe('1234');
591+
expect(v2Fetch1Json.results[6].stx_sent).toBe('0');
574592
expect(v2Fetch1Json.results[6].stx_received).toBe('0');
575593
expect(v2Fetch1Json.results[6].events.stx).toStrictEqual({
576594
transfer: 1,
@@ -682,6 +700,39 @@ describe('address tests', () => {
682700
total: 6,
683701
});
684702

703+
// test address that only received ft balance from an ft event
704+
const v2Fetch4 = await supertest(api.server).get(
705+
`/extended/v2/addresses/${testAddr5}/transactions`
706+
);
707+
expect(v2Fetch4.status).toBe(200);
708+
expect(v2Fetch4.type).toBe('application/json');
709+
expect(v2Fetch4.body.total).toBe(1);
710+
expect(v2Fetch4.body.results[0].events.ft).toStrictEqual({
711+
transfer: 1,
712+
mint: 0,
713+
burn: 0,
714+
});
715+
expect(v2Fetch4.body.results[0].stx_sent).toBe('0');
716+
expect(v2Fetch4.body.results[0].stx_received).toBe('0');
717+
718+
const v2Fetch4Events = await supertest(api.server).get(
719+
`/extended/v2/addresses/${testAddr5}/transactions/${addr3FtEvent.tx_id}/events`
720+
);
721+
expect(v2Fetch4Events.status).toBe(200);
722+
expect(v2Fetch4Events.type).toBe('application/json');
723+
expect(v2Fetch4Events.body.total).toBe(1);
724+
expect(v2Fetch4Events.body.results[0]).toStrictEqual({
725+
type: 'ft',
726+
event_index: addr3FtEvent.event_index,
727+
data: {
728+
type: 'transfer',
729+
amount: addr3FtEvent.amount.toString(),
730+
asset_identifier: addr3FtEvent.asset_identifier,
731+
sender: addr3FtEvent.sender,
732+
recipient: addr3FtEvent.recipient,
733+
},
734+
});
735+
685736
// testing single txs information based on given tx_id
686737
const fetchSingleTxInformation = await supertest(api.server).get(
687738
`/extended/v1/address/${testAddr4}/${testTxId}/with_transfers`

0 commit comments

Comments
 (0)