diff --git a/.changeset/fresh-tigers-relax.md b/.changeset/fresh-tigers-relax.md new file mode 100644 index 0000000000..5ed5183c48 --- /dev/null +++ b/.changeset/fresh-tigers-relax.md @@ -0,0 +1,6 @@ +--- +'@moralisweb3/common-streams-utils': patch +'@moralisweb3/streams': patch +--- + +Added the `ntfTokenApprovals` property to the `EvmStreamResult` class. The `nftApprovals` property is depreciated now. diff --git a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.mock.ts b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.mock.ts index 415902207a..f032f196af 100644 --- a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.mock.ts +++ b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.mock.ts @@ -2437,6 +2437,45 @@ const nativeBalances = { ], }; +export const nftTokenApprovals = { + confirmed: false, + chainId: '0x1', + abi: [], + streamId: '6c86e9ed-0a93-4f8f-af4d-929ee8918bbb', + tag: 'Bored Ape', + retries: 0, + block: { + number: '16225662', + hash: '0x36a8359fa2eaff57364158247dff17d80c053096ad9c54d1c27f4768974f552b', + timestamp: '1671536351', + }, + logs: [], + txs: [], + txsInternal: [], + erc20Transfers: [], + erc20Approvals: [], + nftTokenApprovals: [ + { + transactionHash: '0x8b7ed07563c2e679b9b49e2e0b62d1fe8a37c2f6c6d43a6ed072d1fc9ac15a22', + logIndex: '361', + contract: '0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d', + account: '0x0a1ad77312d36459179ad622c2a8a6280cc79419', + operator: '0x0000000000000000000000000000000000000000', + approvedAll: false, + tokenId: '2947', + tokenName: 'BoredApeYachtClub', + tokenSymbol: 'BAYC', + tokenContractType: 'ERC721', + }, + ], + nftApprovals: { + ERC721: [], + ERC1155: [], + }, + nftTransfers: [], + nativeBalances: [], +}; + export const mockEvmStreamResult = { INITIAL_TEST: initialTest, NATIVE_TX: nativeTransaction, @@ -2448,4 +2487,5 @@ export const mockEvmStreamResult = { ERC1155_APPROVAL: erc1155Approval, WETH_EVENTS: wethEvents, NATIVE_BALANCES: nativeBalances, + NFT_TOKENS_APPROVALS: nftTokenApprovals, }; diff --git a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.test.ts b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.test.ts index ede60e707d..6d6a3228fb 100644 --- a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.test.ts +++ b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.test.ts @@ -56,6 +56,7 @@ describe('EvmStreamResult', () => { ERC1155: [], ERC721: [], }, + ntfTokenApprovals: [], nftTransfers: [], retries: 0, txs: [], diff --git a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.ts b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.ts index 538042bc6d..f98e3979dc 100644 --- a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.ts +++ b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResult.ts @@ -3,6 +3,9 @@ import { EvmStreamResultFormatter } from './EvmStreamResultFormatter'; import { EvmStreamResultParser } from './EvmStreamResultParser'; import { EvmStreamResultData, EvmStreamResultInput } from './types'; import { Interface } from '@ethersproject/abi'; +import { StreamEvmNftTokenApproval } from '../StreamEvmNftTokenApproval'; +import { StreamErc721Approval } from '../StreamErc721Approval'; +import { StreamErc1155Approval } from '../StreamErc1155Approval'; export type EvmStreamResultish = EvmStreamResultInput | EvmStreamResult; @@ -165,10 +168,20 @@ export class EvmStreamResult implements MoralisDataObject { return this._data.logs; } - get nftApprovals() { + /** + * @deprecated Use `ntfTokenApprovals` instead. This property will be removed in the future. + */ + public get nftApprovals(): { + ERC721: StreamErc721Approval[]; + ERC1155: StreamErc1155Approval[]; + } { return this._data.nftApprovals; } + public get ntfTokenApprovals(): StreamEvmNftTokenApproval[] { + return this._data.ntfTokenApprovals; + } + get nftTransfers() { return this._data.nftTransfers; } diff --git a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultFormatter.ts b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultFormatter.ts index a3a0d8e53f..5f84c5ab6d 100644 --- a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultFormatter.ts +++ b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultFormatter.ts @@ -11,6 +11,7 @@ export class EvmStreamResultFormatter { ERC721: data.nftApprovals.ERC721.map((value) => value.toJSON()), ERC1155: data.nftApprovals.ERC1155.map((value) => value.toJSON()), }, + ntfTokenApprovals: data.ntfTokenApprovals.map((value) => value.toJSON()), chain: data.chain.format(), block: data.block.toJSON(), logs: data.logs.map((value) => value.toJSON()), diff --git a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultParser.ts b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultParser.ts index 7e5a60d4e5..e8645c0de9 100644 --- a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultParser.ts +++ b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/EvmStreamResultParser.ts @@ -11,6 +11,7 @@ import { Log, Transaction, INativeBalance, + INFTApproval, } from '@moralisweb3/streams-typings'; import { StreamErc1155Approval } from '../StreamErc1155Approval/StreamErc1155Approval'; import { StreamErc20Approval } from '../StreamErc20Approval/StreamErc20Approval'; @@ -22,6 +23,7 @@ import { StreamEvmTransaction } from '../StreamEvmTransaction/StreamEvmTransacti import { StreamEvmTransactionLog } from '../StreamEvmTransactionLog/StreamEvmTransactionLog'; import { StreamNativeBalance } from '../StreamNativeBalance'; import { EvmStreamResultData, EvmStreamResultInput } from './types'; +import { StreamEvmNftTokenApproval } from '../StreamEvmNftTokenApproval/StreamEvmNftTokenApproval'; export class EvmStreamResultParser { static parse = (value: EvmStreamResultInput, core: Core): EvmStreamResultData => { @@ -32,11 +34,8 @@ export class EvmStreamResultParser { erc20Transfers: this.parseErc20Transfers(value.erc20Transfers, chain), erc20Approvals: this.parseErc20Approvals(value.erc20Approvals, chain), nftTransfers: this.parseNftTransfers(value.nftTransfers, chain), - - /** - * @deprecated Will be removed. Use nftTokenApprovals - */ nftApprovals: this.parseNftApprovals(value.nftApprovals, chain), + ntfTokenApprovals: this.parseNftTokenApprovals(value.nftTokenApprovals, chain, core), block: this.parseBlock(value.block, chain), logs: this.parseLogs(value.logs, chain), txs: this.parseTransactions(value.txs, chain), @@ -99,6 +98,18 @@ export class EvmStreamResultParser { }; } + static parseNftTokenApprovals(values: INFTApproval[], chain: EvmChain, core: Core) { + return values.map((value) => + StreamEvmNftTokenApproval.create( + { + chain, + ...value, + }, + core, + ), + ); + } + static parseBlock(value: Block, chain: EvmChain) { if (value.number === '') { return EvmSimpleBlock.create({ diff --git a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/types.ts b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/types.ts index 5d8d3ad58a..16571fe83a 100644 --- a/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/types.ts +++ b/packages/common/streamsUtils/src/dataTypes/EvmStreamResult/types.ts @@ -10,6 +10,7 @@ import { StreamEvmNftTransfer } from '../StreamEvmNftTransfer/StreamEvmNftTransf import { StreamEvmTransaction } from '../StreamEvmTransaction/StreamEvmTransaction'; import { StreamEvmTransactionLog } from '../StreamEvmTransactionLog/StreamEvmTransactionLog'; import { StreamNativeBalance } from '../StreamNativeBalance'; +import { StreamEvmNftTokenApproval } from '../StreamEvmNftTokenApproval'; export interface EvmStreamResultData { chain: EvmChain; @@ -19,10 +20,14 @@ export interface EvmStreamResultData { erc20Transfers: StreamErc20Transfer[]; erc20Approvals: StreamErc20Approval[]; nftTransfers: StreamEvmNftTransfer[]; + /** + * @deprecated Use `ntfTokenApprovals` instead. This property will be removed in the future. + */ nftApprovals: { ERC721: StreamErc721Approval[]; ERC1155: StreamErc1155Approval[]; }; + ntfTokenApprovals: StreamEvmNftTokenApproval[]; logs: StreamEvmTransactionLog[]; txs: StreamEvmTransaction[]; txsInternal: StreamEvmInternalTransaction[]; diff --git a/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/StreamEvmNftTokenApproval.test.ts b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/StreamEvmNftTokenApproval.test.ts new file mode 100644 index 0000000000..13cee286ea --- /dev/null +++ b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/StreamEvmNftTokenApproval.test.ts @@ -0,0 +1,42 @@ +import Core from '@moralisweb3/common-core'; +import { setupStreamsUtils } from '../../test/setup'; +import { StreamEvmNftTokenApproval } from './StreamEvmNftTokenApproval'; + +describe('StreamEvmNftTokenApproval', () => { + let core: Core; + + beforeAll(() => { + core = setupStreamsUtils(); + }); + + it('should return correct values for all getters', () => { + const approval = StreamEvmNftTokenApproval.create( + { + chain: '0x22', + transactionHash: '0x8b7ed07563c2e679b9b49e2e0b62d1fe8a37c2f6c6d43a6ed072d1fc9ac15a22', + logIndex: '361', + contract: '0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d', + account: '0x0a1ad77312d36459179ad622c2a8a6280cc79419', + operator: '0x0000000000000000000000000000000000000000', + approvedAll: false, + tokenId: '2947', + tokenName: 'BoredApeYachtClub', + tokenSymbol: 'BAYC', + tokenContractType: 'ERC721', + }, + core, + ); + + expect(approval.chain.decimal).toBe(0x22); + expect(approval.transactionHash).toBe('0x8b7ed07563c2e679b9b49e2e0b62d1fe8a37c2f6c6d43a6ed072d1fc9ac15a22'); + expect(approval.logIndex).toBe('361'); + expect(approval.contract).toBe('0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d'); + expect(approval.account).toBe('0x0a1ad77312d36459179ad622c2a8a6280cc79419'); + expect(approval.operator).toBe('0x0000000000000000000000000000000000000000'); + expect(approval.approvedAll).toBe(false); + expect(approval.tokenId).toBe('2947'); + expect(approval.tokenName).toBe('BoredApeYachtClub'); + expect(approval.tokenSymbol).toBe('BAYC'); + expect(approval.tokenContractType).toBe('ERC721'); + }); +}); diff --git a/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/StreamEvmNftTokenApproval.ts b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/StreamEvmNftTokenApproval.ts new file mode 100644 index 0000000000..c62cd7a947 --- /dev/null +++ b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/StreamEvmNftTokenApproval.ts @@ -0,0 +1,105 @@ +import { + Core, + CoreProvider, + MoralisDataFormatted, + MoralisDataObject, + MoralisDataObjectValue, +} from '@moralisweb3/common-core'; +import { StreamEvmNftTokenApprovalData, StreamEvmNftTokenApprovalish } from './types'; +import { EvmChain } from '@moralisweb3/common-evm-utils'; + +/** + * The `StreamEvmNftTokenApproval` class is a representation of the NFT approval data. + * + * @category DataType + */ +export class StreamEvmNftTokenApproval implements StreamEvmNftTokenApprovalData, MoralisDataObject { + public static create(data: StreamEvmNftTokenApprovalish, core?: Core): StreamEvmNftTokenApproval { + const finalCore = core ?? CoreProvider.getDefault(); + const chain = EvmChain.create(data.chain, finalCore); + return new StreamEvmNftTokenApproval({ + ...data, + chain, + }); + } + + private constructor(private readonly data: StreamEvmNftTokenApprovalData) {} + + public get chain(): EvmChain { + return this.data.chain; + } + + public get contract(): string { + return this.data.contract; + } + + public get account(): string { + return this.data.account; + } + + public get operator(): string { + return this.data.operator; + } + public get approvedAll(): boolean { + return this.data.approvedAll; + } + + public get tokenId(): string | null { + return this.data.tokenId; + } + + public get transactionHash(): string { + return this.data.transactionHash; + } + + public get logIndex(): string { + return this.data.logIndex; + } + + public get tokenContractType(): string { + return this.data.tokenContractType; + } + + public get tokenName(): string { + return this.data.tokenName; + } + + public get tokenSymbol(): string { + return this.data.tokenSymbol; + } + + public toJSON(): MoralisDataObjectValue { + return { + chain: this.chain.format(), + contract: this.contract, + account: this.account, + operator: this.operator, + approvedAll: this.approvedAll, + tokenId: this.tokenId, + transactionHash: this.transactionHash, + logIndex: this.logIndex, + tokenContractType: this.tokenContractType, + tokenName: this.tokenName, + tokenSymbol: this.tokenSymbol, + }; + } + + public format(): MoralisDataFormatted { + return this.toJSON(); + } + + public equals(value: this): boolean { + return ( + this.contract === value.contract && + this.account === value.account && + this.operator === value.operator && + this.approvedAll === value.approvedAll && + this.tokenId === value.tokenId && + this.transactionHash === value.transactionHash && + this.logIndex === value.logIndex && + this.tokenContractType === value.tokenContractType && + this.tokenName === value.tokenName && + this.tokenSymbol === value.tokenSymbol + ); + } +} diff --git a/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/index.ts b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/index.ts new file mode 100644 index 0000000000..7ace6c7581 --- /dev/null +++ b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/index.ts @@ -0,0 +1,2 @@ +export * from './types'; +export * from './StreamEvmNftTokenApproval'; diff --git a/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/types.ts b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/types.ts new file mode 100644 index 0000000000..6b7584b51c --- /dev/null +++ b/packages/common/streamsUtils/src/dataTypes/StreamEvmNftTokenApproval/types.ts @@ -0,0 +1,10 @@ +import { EvmChain, EvmChainish } from '@moralisweb3/common-evm-utils'; +import { INFTApproval } from '@moralisweb3/streams-typings'; + +export type StreamEvmNftTokenApprovalish = INFTApproval & { + chain: EvmChainish; +}; + +export type StreamEvmNftTokenApprovalData = INFTApproval & { + chain: EvmChain; +}; diff --git a/packages/common/streamsUtils/src/dataTypes/index.ts b/packages/common/streamsUtils/src/dataTypes/index.ts index e0cbeeadb0..96891167d8 100644 --- a/packages/common/streamsUtils/src/dataTypes/index.ts +++ b/packages/common/streamsUtils/src/dataTypes/index.ts @@ -6,6 +6,7 @@ export * from './StreamErc20Approval'; export * from './StreamErc20Transfer'; export * from './StreamErc721Approval'; export * from './StreamEvmInternalTransaction'; +export * from './StreamEvmNftTokenApproval'; export * from './StreamEvmNftTransfer'; export * from './StreamEvmTransaction'; export * from './StreamEvmTransactionLog';