From deea8dc3a0b0a4885047a93a3f07c13e22e06f17 Mon Sep 17 00:00:00 2001 From: Gabo Esquivel Date: Fri, 23 Aug 2024 00:49:23 -0600 Subject: [PATCH 1/6] chore(alchemy): export types --- apps/alchemy/package.json | 5 +- apps/alchemy/src/create.ts | 26 ++ apps/alchemy/src/index.ts | 27 +- apps/alchemy/src/types.ts | 746 +++++++++++++++++++++++++++++++++++++ apps/indexer/package.json | 1 + bun.lockb | Bin 824536 -> 824568 bytes 6 files changed, 777 insertions(+), 28 deletions(-) create mode 100644 apps/alchemy/src/create.ts create mode 100644 apps/alchemy/src/types.ts diff --git a/apps/alchemy/package.json b/apps/alchemy/package.json index be4973e23..1c49cd26f 100644 --- a/apps/alchemy/package.json +++ b/apps/alchemy/package.json @@ -1,9 +1,10 @@ { - "name": "alchemy-hooks", + "name": "@repo/alchemy", "module": "src/index.ts", + "types": "src/index.d.ts", "type": "module", "scripts": { - "push": "bun src/index.ts" + "create": "bun src/create.ts" }, "devDependencies": { "@types/bun": "latest" diff --git a/apps/alchemy/src/create.ts b/apps/alchemy/src/create.ts new file mode 100644 index 000000000..7b5629cc8 --- /dev/null +++ b/apps/alchemy/src/create.ts @@ -0,0 +1,26 @@ +import { Alchemy, Network, WebhookType } from 'alchemy-sdk' +import { appConfig } from './config' + +async function createAddressActivityNotification() { + const settings = { + authToken: appConfig.alchemyNotifyToken, + network: Network.MATIC_MAINNET, // Replace with your network. + } + + const alchemy = new Alchemy(settings) + const addressActivityWebhook = await alchemy.notify.createWebhook( + appConfig.alchemyActivityWebhookUrl, + WebhookType.ADDRESS_ACTIVITY, + { + addresses: [appConfig.presaleAddress], + network: Network.MATIC_MAINNET, + }, + ) + console.log('Address Activity Webhook Details:') + console.log(JSON.stringify(addressActivityWebhook, null, 2)) + console.log( + 'Alchemy Notify address activity notification created, go to https://dashboard.alchemy.com/notify to see details of your custom hook.', + ) +} + +createAddressActivityNotification() diff --git a/apps/alchemy/src/index.ts b/apps/alchemy/src/index.ts index 7b5629cc8..c9f6f047d 100644 --- a/apps/alchemy/src/index.ts +++ b/apps/alchemy/src/index.ts @@ -1,26 +1 @@ -import { Alchemy, Network, WebhookType } from 'alchemy-sdk' -import { appConfig } from './config' - -async function createAddressActivityNotification() { - const settings = { - authToken: appConfig.alchemyNotifyToken, - network: Network.MATIC_MAINNET, // Replace with your network. - } - - const alchemy = new Alchemy(settings) - const addressActivityWebhook = await alchemy.notify.createWebhook( - appConfig.alchemyActivityWebhookUrl, - WebhookType.ADDRESS_ACTIVITY, - { - addresses: [appConfig.presaleAddress], - network: Network.MATIC_MAINNET, - }, - ) - console.log('Address Activity Webhook Details:') - console.log(JSON.stringify(addressActivityWebhook, null, 2)) - console.log( - 'Alchemy Notify address activity notification created, go to https://dashboard.alchemy.com/notify to see details of your custom hook.', - ) -} - -createAddressActivityNotification() +export * from './types' diff --git a/apps/alchemy/src/types.ts b/apps/alchemy/src/types.ts new file mode 100644 index 000000000..c3bdce714 --- /dev/null +++ b/apps/alchemy/src/types.ts @@ -0,0 +1,746 @@ +export interface AlchemyWebhookEvent { + webhookId: string + id: string + createdAt: Date + type: AlchemyWebhookType + event: Record +} + +export type AlchemyWebhookType = + | 'MINED_TRANSACTION' + | 'DROPPED_TRANSACTION' + | 'ADDRESS_ACTIVITY' + +// { +// "webhookId": "wh_s4jwyyp1291ffua0", +// "id": "whevt_ulgdrcxq4db72zgn", +// "createdAt": "2024-08-23T05:27:14.931405209Z", +// "type": "ADDRESS_ACTIVITY", +// "event": { +// "network": "MATIC_MAINNET", +// "activity": [ +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x51bbd64ee99038580481df9605bff93a5921e238", +// "blockNum": "0x19d7421", +// "hash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", +// "erc1155Metadata": [ +// { +// "tokenId": "0xcf", +// "value": "0x1bc16d674ec800000" +// }, +// { +// "tokenId": "0x1f7", +// "value": "0x1" +// }, +// { +// "tokenId": "0x259", +// "value": "0x4563918244f40000" +// }, +// { +// "tokenId": "0x6a", +// "value": "0x1bc16d674ec80000" +// }, +// { +// "tokenId": "0x6b", +// "value": "0x3782dace9d900000" +// } +// ], +// "category": "erc1155", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000001f70000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000003782dace9d900000", +// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422" +// }, +// "log": { +// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422", +// "topics": [ +// "0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb", +// "0x000000000000000000000000070717e1bc4c6e46c22b0e0b8821e0ac1d4689c3", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x00000000000000000000000051bbd64ee99038580481df9605bff93a5921e238" +// ], +// "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000001f70000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000003782dace9d900000", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", +// "transactionIndex": "0x26", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x10e", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x13ededc25bca247250b93c6eab0291c44273ceb1", +// "toAddress": "0x0000000000000000000000000000000000000000", +// "blockNum": "0x19d7421", +// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "value": 140316, +// "category": "token", +// "rawContract": { +// "rawValue": "0x000000000000000000000000000000000000000000000000000000000002241c", +// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9" +// }, +// "log": { +// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x00000000000000000000000013ededc25bca247250b93c6eab0291c44273ceb1", +// "0x0000000000000000000000000000000000000000000000000000000000000000" +// ], +// "data": "0x000000000000000000000000000000000000000000000000000000000002241c", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "transactionIndex": "0x9", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x53", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0xb7f575de9deac0180dfbb9020f42a19ad6a2c0dd", +// "blockNum": "0x19d7421", +// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "value": 4.0114719726714655e+21, +// "category": "token", +// "rawContract": { +// "rawValue": "0x0000000000000000000000000000000000000000000000d9765b59748e33b0af", +// "address": "0x59e8e9100cbfcbcbadf86b9279fa61526bbb8765" +// }, +// "log": { +// "address": "0x59e8e9100cbfcbcbadf86b9279fa61526bbb8765", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x000000000000000000000000b7f575de9deac0180dfbb9020f42a19ad6a2c0dd" +// ], +// "data": "0x0000000000000000000000000000000000000000000000d9765b59748e33b0af", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "transactionIndex": "0x3", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x1b", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x45ed97bbee5398e3d11d0c21b8c5768486feed10", +// "toAddress": "0xf715beb51ec8f63317d66f491e37e7bb048fcc2d", +// "blockNum": "0x19d7421", +// "hash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", +// "value": 0.0010625, +// "asset": "WETH", +// "category": "token", +// "rawContract": { +// "rawValue": "0x0000000000000000000000000000000000000000000000000003c6568f12e800", +// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", +// "decimals": 18 +// }, +// "log": { +// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x00000000000000000000000045ed97bbee5398e3d11d0c21b8c5768486feed10", +// "0x000000000000000000000000f715beb51ec8f63317d66f491e37e7bb048fcc2d" +// ], +// "data": "0x0000000000000000000000000000000000000000000000000003c6568f12e800", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", +// "transactionIndex": "0x8", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x35", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x7734280a4337f37fbf4651073db7c28c80b339e9", +// "blockNum": "0x19d7421", +// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "value": 202049, +// "category": "token", +// "rawContract": { +// "rawValue": "0x0000000000000000000000000000000000000000000000000000000000031541", +// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f" +// }, +// "log": { +// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000007734280a4337f37fbf4651073db7c28c80b339e9" +// ], +// "data": "0x0000000000000000000000000000000000000000000000000000000000031541", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "transactionIndex": "0x3", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x11", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x24f2520eff6105fcc22a9c18aaa6ed7f6e44a47f", +// "blockNum": "0x19d7421", +// "hash": "0x758b1fb3c9c6565af0bb9f3b51025bbc2c60f7f57f7e62a820488a2af0b147b1", +// "erc721TokenId": "0x131", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0xf2301d1a9f7b332921bf7127cdac684b53fa43c2" +// }, +// "log": { +// "address": "0xf2301d1a9f7b332921bf7127cdac684b53fa43c2", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x00000000000000000000000024f2520eff6105fcc22a9c18aaa6ed7f6e44a47f", +// "0x0000000000000000000000000000000000000000000000000000000000000131" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x758b1fb3c9c6565af0bb9f3b51025bbc2c60f7f57f7e62a820488a2af0b147b1", +// "transactionIndex": "0x2a", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x12f", +// "removed": false +// } +// }, +// { +// "fromAddress": "0xc765eca0ad3fd27779d36d18e32552bd7e26fd7b", +// "toAddress": "0x1111111254fb6c44bac0bed2854e76f90643097d", +// "blockNum": "0x19d7421", +// "hash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", +// "value": 555712363075697400, +// "category": "token", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", +// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7" +// }, +// "log": { +// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x000000000000000000000000c765eca0ad3fd27779d36d18e32552bd7e26fd7b", +// "0x0000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d" +// ], +// "data": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", +// "transactionIndex": "0x37", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x16c", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", +// "blockNum": "0x19d7421", +// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "erc721TokenId": "0x95", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" +// }, +// "log": { +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", +// "0x0000000000000000000000000000000000000000000000000000000000000095" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "transactionIndex": "0x2e", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x14b", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x80ff4e4153883d770204607eb4af9994739c72dc", +// "blockNum": "0x19d7421", +// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "value": 57072197, +// "category": "token", +// "rawContract": { +// "rawValue": "0x000000000000000000000000000000000000000000000000000000000366da45", +// "address": "0xee3b4ce32a6229ae15903cda0a5da92e739685f7" +// }, +// "log": { +// "address": "0xee3b4ce32a6229ae15903cda0a5da92e739685f7", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x00000000000000000000000080ff4e4153883d770204607eb4af9994739c72dc" +// ], +// "data": "0x000000000000000000000000000000000000000000000000000000000366da45", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "transactionIndex": "0x9", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x3e", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x13ededc25bca247250b93c6eab0291c44273ceb1", +// "blockNum": "0x19d7421", +// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "value": 1.1212739901862213e+21, +// "category": "token", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000003cc8cd714f668e83fd", +// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454" +// }, +// "log": { +// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x00000000000000000000000013ededc25bca247250b93c6eab0291c44273ceb1" +// ], +// "data": "0x00000000000000000000000000000000000000000000003cc8cd714f668e83fd", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "transactionIndex": "0x9", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x4d", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", +// "blockNum": "0x19d7421", +// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "erc721TokenId": "0x96", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" +// }, +// "log": { +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", +// "0x0000000000000000000000000000000000000000000000000000000000000096" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "transactionIndex": "0x2e", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x14c", +// "removed": false +// } +// }, +// { +// "fromAddress": "0xf9875c63bae047fc819a3c2351caf2a4b957851a", +// "toAddress": "0x0000000000000000000000000000000000000000", +// "blockNum": "0x19d7421", +// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "value": 57436302, +// "category": "token", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000000000000000036c688e", +// "address": "0xe680e0317402ad3cb37d5ed9fc642702658ef57f" +// }, +// "log": { +// "address": "0xe680e0317402ad3cb37d5ed9fc642702658ef57f", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x000000000000000000000000f9875c63bae047fc819a3c2351caf2a4b957851a", +// "0x0000000000000000000000000000000000000000000000000000000000000000" +// ], +// "data": "0x00000000000000000000000000000000000000000000000000000000036c688e", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "transactionIndex": "0x9", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x64", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x51bbd64ee99038580481df9605bff93a5921e238", +// "blockNum": "0x19d7421", +// "hash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", +// "value": 8.369, +// "asset": "Sunflower Land", +// "category": "token", +// "rawContract": { +// "rawValue": "0x0000000000000000000000000000000000000000000000007424a928bd3e8000", +// "address": "0xd1f9c58e33933a993a3891f8acfe05a68e1afc05", +// "decimals": 18 +// }, +// "log": { +// "address": "0xd1f9c58e33933a993a3891f8acfe05a68e1afc05", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x00000000000000000000000051bbd64ee99038580481df9605bff93a5921e238" +// ], +// "data": "0x0000000000000000000000000000000000000000000000007424a928bd3e8000", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", +// "transactionIndex": "0x26", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x110", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x6bf218e7e39025f75a9cf138d574cdb84ce64639", +// "blockNum": "0x19d7421", +// "hash": "0x19779a02bb24e3fceadc4b027c1bfb47553cbc0596bfe1c28c50be760a824994", +// "erc721TokenId": "0x20", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0x3926480d67aece1f5f314f8daa66fe33ceca083e" +// }, +// "log": { +// "address": "0x3926480d67aece1f5f314f8daa66fe33ceca083e", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000006bf218e7e39025f75a9cf138d574cdb84ce64639", +// "0x0000000000000000000000000000000000000000000000000000000000000020" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x19779a02bb24e3fceadc4b027c1bfb47553cbc0596bfe1c28c50be760a824994", +// "transactionIndex": "0xa", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x75", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", +// "blockNum": "0x19d7421", +// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "erc721TokenId": "0x93", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" +// }, +// "log": { +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", +// "0x0000000000000000000000000000000000000000000000000000000000000093" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "transactionIndex": "0x2e", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x149", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x51bbd64ee99038580481df9605bff93a5921e238", +// "toAddress": "0x0000000000000000000000000000000000000000", +// "blockNum": "0x19d7421", +// "hash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", +// "erc1155Metadata": [ +// { +// "tokenId": "0x65", +// "value": "0x98a7d9b8314c0000" +// }, +// { +// "tokenId": "0x69", +// "value": "0x8ac7230489e80000" +// } +// ], +// "category": "erc1155", +// "rawContract": { +// "rawValue": "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000098a7d9b8314c00000000000000000000000000000000000000000000000000008ac7230489e80000", +// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422" +// }, +// "log": { +// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422", +// "topics": [ +// "0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb", +// "0x000000000000000000000000070717e1bc4c6e46c22b0e0b8821e0ac1d4689c3", +// "0x00000000000000000000000051bbd64ee99038580481df9605bff93a5921e238", +// "0x0000000000000000000000000000000000000000000000000000000000000000" +// ], +// "data": "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000098a7d9b8314c00000000000000000000000000000000000000000000000000008ac7230489e80000", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", +// "transactionIndex": "0x26", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x10f", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x80ff4e4153883d770204607eb4af9994739c72dc", +// "toAddress": "0x0000000000000000000000000000000000000000", +// "blockNum": "0x19d7421", +// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "value": 1.1222849947116925e+21, +// "category": "token", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000003cd6d54091cd9336f9", +// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454" +// }, +// "log": { +// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x00000000000000000000000080ff4e4153883d770204607eb4af9994739c72dc", +// "0x0000000000000000000000000000000000000000000000000000000000000000" +// ], +// "data": "0x00000000000000000000000000000000000000000000003cd6d54091cd9336f9", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "transactionIndex": "0x9", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x44", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", +// "blockNum": "0x19d7421", +// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "erc721TokenId": "0x94", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" +// }, +// "log": { +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", +// "0x0000000000000000000000000000000000000000000000000000000000000094" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "transactionIndex": "0x2e", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x14a", +// "removed": false +// } +// }, +// { +// "fromAddress": "0xf715beb51ec8f63317d66f491e37e7bb048fcc2d", +// "toAddress": "0xe0036fb4b5a3b232acfc01fec3bd1d787a93da75", +// "blockNum": "0x19d7421", +// "hash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", +// "value": 0.00085, +// "asset": "WETH", +// "category": "token", +// "rawContract": { +// "rawValue": "0x000000000000000000000000000000000000000000000000000305120c0f2000", +// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", +// "decimals": 18 +// }, +// "log": { +// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x000000000000000000000000f715beb51ec8f63317d66f491e37e7bb048fcc2d", +// "0x000000000000000000000000e0036fb4b5a3b232acfc01fec3bd1d787a93da75" +// ], +// "data": "0x000000000000000000000000000000000000000000000000000305120c0f2000", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", +// "transactionIndex": "0x8", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x3a", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x1111111254fb6c44bac0bed2854e76f90643097d", +// "toAddress": "0xc590175e458b83680867afd273527ff58f74c02b", +// "blockNum": "0x19d7421", +// "hash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", +// "value": 555712363075697400, +// "category": "token", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", +// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7" +// }, +// "log": { +// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d", +// "0x000000000000000000000000c590175e458b83680867afd273527ff58f74c02b" +// ], +// "data": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", +// "transactionIndex": "0x37", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x16f", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x7734280a4337f37fbf4651073db7c28c80b339e9", +// "blockNum": "0x19d7421", +// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "value": 2292228693313522200, +// "category": "token", +// "rawContract": { +// "rawValue": "0x0000000000000000000000000000000000000000000000001fcfa1da10e909df", +// "address": "0x8df3aad3a84da6b69a4da8aec3ea40d9091b2ac4" +// }, +// "log": { +// "address": "0x8df3aad3a84da6b69a4da8aec3ea40d9091b2ac4", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000007734280a4337f37fbf4651073db7c28c80b339e9" +// ], +// "data": "0x0000000000000000000000000000000000000000000000001fcfa1da10e909df", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "transactionIndex": "0x3", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x19", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", +// "blockNum": "0x19d7421", +// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "erc721TokenId": "0x97", +// "category": "token", +// "rawContract": { +// "rawValue": "0x", +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" +// }, +// "log": { +// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", +// "0x0000000000000000000000000000000000000000000000000000000000000097" +// ], +// "data": "0x", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", +// "transactionIndex": "0x2e", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x14d", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0xb7f575de9deac0180dfbb9020f42a19ad6a2c0dd", +// "blockNum": "0x19d7421", +// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "value": 7962164689, +// "category": "token", +// "rawContract": { +// "rawValue": "0x00000000000000000000000000000000000000000000000000000001da94fdd1", +// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f" +// }, +// "log": { +// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x000000000000000000000000b7f575de9deac0180dfbb9020f42a19ad6a2c0dd" +// ], +// "data": "0x00000000000000000000000000000000000000000000000000000001da94fdd1", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", +// "transactionIndex": "0x3", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x16", +// "removed": false +// } +// }, +// { +// "fromAddress": "0xf715beb51ec8f63317d66f491e37e7bb048fcc2d", +// "toAddress": "0x5b3256965e7c3cf26e11fcaf296dfc8807c01073", +// "blockNum": "0x19d7421", +// "hash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", +// "value": 0.0002125, +// "asset": "WETH", +// "category": "token", +// "rawContract": { +// "rawValue": "0x0000000000000000000000000000000000000000000000000000c1448303c800", +// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", +// "decimals": 18 +// }, +// "log": { +// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x000000000000000000000000f715beb51ec8f63317d66f491e37e7bb048fcc2d", +// "0x0000000000000000000000005b3256965e7c3cf26e11fcaf296dfc8807c01073" +// ], +// "data": "0x0000000000000000000000000000000000000000000000000000c1448303c800", +// "blockNumber": "0x19d7421", +// "transactionHash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", +// "transactionIndex": "0x8", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x39", +// "removed": false +// } +// }, +// { +// "fromAddress": "0x0000000000000000000000000000000000000000", +// "toAddress": "0xf9875c63bae047fc819a3c2351caf2a4b957851a", +// "blockNum": "0x19d7421", +// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "value": 140189, +// "category": "token", +// "rawContract": { +// "rawValue": "0x000000000000000000000000000000000000000000000000000000000002239d", +// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9" +// }, +// "log": { +// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9", +// "topics": [ +// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", +// "0x0000000000000000000000000000000000000000000000000000000000000000", +// "0x000000000000000000000000f9875c63bae047fc819a3c2351caf2a4b957851a" +// ], +// "data": "0x000000000000000000000000000000000000000000000000000000000002239d", +// "blockNumber": "0x19d7421", +// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", +// "transactionIndex": "0x9", +// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", +// "logIndex": "0x5e", +// "removed": false +// } +// } +// ] +// } +// } diff --git a/apps/indexer/package.json b/apps/indexer/package.json index 6c4aed519..f660e3a1a 100644 --- a/apps/indexer/package.json +++ b/apps/indexer/package.json @@ -16,6 +16,7 @@ "@dfuse/client": "^0.3.21", "@repo/supabase": "workspace:*", "@repo/trigger": "workspace:*", + "@repo/alchemy": "workspace:*", "@sentry/integrations": "^7.114.0", "@sentry/node": "^8.19.0", "@sentry/profiling-node": "^8.26.0", diff --git a/bun.lockb b/bun.lockb index 6876c12e42a02817fc21491c215db32a340e7c82..9ea43eec393a2453b119e965bae2d84ba78bdc39 100755 GIT binary patch delta 19452 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 delta 19528 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 X^AZ>VGW9#Gx}wcup9ZcE0*U_tdHwQQ From 78c938136563bd4f94fb45834e7e8581079777c7 Mon Sep 17 00:00:00 2001 From: Gabo Esquivel Date: Fri, 23 Aug 2024 00:51:22 -0600 Subject: [PATCH 2/6] chore(indexer): log process event id --- apps/indexer/src/routes/alchemy.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/apps/indexer/src/routes/alchemy.ts b/apps/indexer/src/routes/alchemy.ts index 890e18735..d13b6a70b 100644 --- a/apps/indexer/src/routes/alchemy.ts +++ b/apps/indexer/src/routes/alchemy.ts @@ -1,4 +1,5 @@ import crypto from 'crypto' +import type { AlchemyWebhookEvent } from '@repo/alchemy' import { addressActivityTask } from '@repo/trigger' import type { Request, Response } from 'express' import { appConfig } from '~/config' @@ -39,16 +40,3 @@ function validateAlchemySignature(req: Request): boolean { hmac.update(payload) return alchemySignature === hmac.digest('hex') } - -export interface AlchemyWebhookEvent { - webhookId: string - id: string - createdAt: Date - type: AlchemyWebhookType - event: Record -} - -export type AlchemyWebhookType = - | 'MINED_TRANSACTION' - | 'DROPPED_TRANSACTION' - | 'ADDRESS_ACTIVITY' From 28b16742a435d2dac7b8c4e5ef88341ba096bf02 Mon Sep 17 00:00:00 2001 From: Gabo Esquivel Date: Fri, 23 Aug 2024 00:51:31 -0600 Subject: [PATCH 3/6] chore(indexer): log process event id --- apps/indexer/src/routes/alchemy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/indexer/src/routes/alchemy.ts b/apps/indexer/src/routes/alchemy.ts index d13b6a70b..182d3fca1 100644 --- a/apps/indexer/src/routes/alchemy.ts +++ b/apps/indexer/src/routes/alchemy.ts @@ -22,7 +22,7 @@ export async function alchemyWebhook(req: Request, res: Response) { const handle = await addressActivityTask.trigger(req.body) logger.info(`Triggered address activity task: ${JSON.stringify(handle)}`) - res.status(200).send('Webhook processed') + res.status(200).send(`Webhook ${evt.id} processed`) } /** From e45981ee8faa91d08cd72bd2fe5f75cd2d014928 Mon Sep 17 00:00:00 2001 From: Gabo Esquivel Date: Fri, 23 Aug 2024 01:37:25 -0600 Subject: [PATCH 4/6] chore: prod network conig, validate networks --- .vscode/settings.json | 4 +- apps/alchemy/src/types.ts | 733 --------------------------- apps/indexer/src/routes/alchemy.ts | 25 +- apps/trigger/package.json | 4 +- apps/trigger/src/trigger/activity.ts | 40 +- bun.lockb | Bin 824568 -> 824624 bytes packages/app-env/src/chains.ts | 35 +- 7 files changed, 75 insertions(+), 766 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index fa9f49187..6c70aba17 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,5 +15,7 @@ }, "editor.codeActionsOnSave": { "source.organizeImports.biome": "explicit" - } + }, + "editor.insertSpaces": true, + "editor.tabSize": 2 } diff --git a/apps/alchemy/src/types.ts b/apps/alchemy/src/types.ts index c3bdce714..207c5b09a 100644 --- a/apps/alchemy/src/types.ts +++ b/apps/alchemy/src/types.ts @@ -11,736 +11,3 @@ export type AlchemyWebhookType = | 'DROPPED_TRANSACTION' | 'ADDRESS_ACTIVITY' -// { -// "webhookId": "wh_s4jwyyp1291ffua0", -// "id": "whevt_ulgdrcxq4db72zgn", -// "createdAt": "2024-08-23T05:27:14.931405209Z", -// "type": "ADDRESS_ACTIVITY", -// "event": { -// "network": "MATIC_MAINNET", -// "activity": [ -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x51bbd64ee99038580481df9605bff93a5921e238", -// "blockNum": "0x19d7421", -// "hash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", -// "erc1155Metadata": [ -// { -// "tokenId": "0xcf", -// "value": "0x1bc16d674ec800000" -// }, -// { -// "tokenId": "0x1f7", -// "value": "0x1" -// }, -// { -// "tokenId": "0x259", -// "value": "0x4563918244f40000" -// }, -// { -// "tokenId": "0x6a", -// "value": "0x1bc16d674ec80000" -// }, -// { -// "tokenId": "0x6b", -// "value": "0x3782dace9d900000" -// } -// ], -// "category": "erc1155", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000001f70000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000003782dace9d900000", -// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422" -// }, -// "log": { -// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422", -// "topics": [ -// "0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb", -// "0x000000000000000000000000070717e1bc4c6e46c22b0e0b8821e0ac1d4689c3", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x00000000000000000000000051bbd64ee99038580481df9605bff93a5921e238" -// ], -// "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000001f70000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000003782dace9d900000", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", -// "transactionIndex": "0x26", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x10e", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x13ededc25bca247250b93c6eab0291c44273ceb1", -// "toAddress": "0x0000000000000000000000000000000000000000", -// "blockNum": "0x19d7421", -// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "value": 140316, -// "category": "token", -// "rawContract": { -// "rawValue": "0x000000000000000000000000000000000000000000000000000000000002241c", -// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9" -// }, -// "log": { -// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x00000000000000000000000013ededc25bca247250b93c6eab0291c44273ceb1", -// "0x0000000000000000000000000000000000000000000000000000000000000000" -// ], -// "data": "0x000000000000000000000000000000000000000000000000000000000002241c", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "transactionIndex": "0x9", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x53", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0xb7f575de9deac0180dfbb9020f42a19ad6a2c0dd", -// "blockNum": "0x19d7421", -// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "value": 4.0114719726714655e+21, -// "category": "token", -// "rawContract": { -// "rawValue": "0x0000000000000000000000000000000000000000000000d9765b59748e33b0af", -// "address": "0x59e8e9100cbfcbcbadf86b9279fa61526bbb8765" -// }, -// "log": { -// "address": "0x59e8e9100cbfcbcbadf86b9279fa61526bbb8765", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x000000000000000000000000b7f575de9deac0180dfbb9020f42a19ad6a2c0dd" -// ], -// "data": "0x0000000000000000000000000000000000000000000000d9765b59748e33b0af", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "transactionIndex": "0x3", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x1b", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x45ed97bbee5398e3d11d0c21b8c5768486feed10", -// "toAddress": "0xf715beb51ec8f63317d66f491e37e7bb048fcc2d", -// "blockNum": "0x19d7421", -// "hash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", -// "value": 0.0010625, -// "asset": "WETH", -// "category": "token", -// "rawContract": { -// "rawValue": "0x0000000000000000000000000000000000000000000000000003c6568f12e800", -// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", -// "decimals": 18 -// }, -// "log": { -// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x00000000000000000000000045ed97bbee5398e3d11d0c21b8c5768486feed10", -// "0x000000000000000000000000f715beb51ec8f63317d66f491e37e7bb048fcc2d" -// ], -// "data": "0x0000000000000000000000000000000000000000000000000003c6568f12e800", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", -// "transactionIndex": "0x8", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x35", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x7734280a4337f37fbf4651073db7c28c80b339e9", -// "blockNum": "0x19d7421", -// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "value": 202049, -// "category": "token", -// "rawContract": { -// "rawValue": "0x0000000000000000000000000000000000000000000000000000000000031541", -// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f" -// }, -// "log": { -// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000007734280a4337f37fbf4651073db7c28c80b339e9" -// ], -// "data": "0x0000000000000000000000000000000000000000000000000000000000031541", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "transactionIndex": "0x3", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x11", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x24f2520eff6105fcc22a9c18aaa6ed7f6e44a47f", -// "blockNum": "0x19d7421", -// "hash": "0x758b1fb3c9c6565af0bb9f3b51025bbc2c60f7f57f7e62a820488a2af0b147b1", -// "erc721TokenId": "0x131", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0xf2301d1a9f7b332921bf7127cdac684b53fa43c2" -// }, -// "log": { -// "address": "0xf2301d1a9f7b332921bf7127cdac684b53fa43c2", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x00000000000000000000000024f2520eff6105fcc22a9c18aaa6ed7f6e44a47f", -// "0x0000000000000000000000000000000000000000000000000000000000000131" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x758b1fb3c9c6565af0bb9f3b51025bbc2c60f7f57f7e62a820488a2af0b147b1", -// "transactionIndex": "0x2a", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x12f", -// "removed": false -// } -// }, -// { -// "fromAddress": "0xc765eca0ad3fd27779d36d18e32552bd7e26fd7b", -// "toAddress": "0x1111111254fb6c44bac0bed2854e76f90643097d", -// "blockNum": "0x19d7421", -// "hash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", -// "value": 555712363075697400, -// "category": "token", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", -// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7" -// }, -// "log": { -// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x000000000000000000000000c765eca0ad3fd27779d36d18e32552bd7e26fd7b", -// "0x0000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d" -// ], -// "data": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", -// "transactionIndex": "0x37", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x16c", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", -// "blockNum": "0x19d7421", -// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "erc721TokenId": "0x95", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" -// }, -// "log": { -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", -// "0x0000000000000000000000000000000000000000000000000000000000000095" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "transactionIndex": "0x2e", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x14b", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x80ff4e4153883d770204607eb4af9994739c72dc", -// "blockNum": "0x19d7421", -// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "value": 57072197, -// "category": "token", -// "rawContract": { -// "rawValue": "0x000000000000000000000000000000000000000000000000000000000366da45", -// "address": "0xee3b4ce32a6229ae15903cda0a5da92e739685f7" -// }, -// "log": { -// "address": "0xee3b4ce32a6229ae15903cda0a5da92e739685f7", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x00000000000000000000000080ff4e4153883d770204607eb4af9994739c72dc" -// ], -// "data": "0x000000000000000000000000000000000000000000000000000000000366da45", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "transactionIndex": "0x9", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x3e", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x13ededc25bca247250b93c6eab0291c44273ceb1", -// "blockNum": "0x19d7421", -// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "value": 1.1212739901862213e+21, -// "category": "token", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000003cc8cd714f668e83fd", -// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454" -// }, -// "log": { -// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x00000000000000000000000013ededc25bca247250b93c6eab0291c44273ceb1" -// ], -// "data": "0x00000000000000000000000000000000000000000000003cc8cd714f668e83fd", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "transactionIndex": "0x9", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x4d", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", -// "blockNum": "0x19d7421", -// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "erc721TokenId": "0x96", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" -// }, -// "log": { -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", -// "0x0000000000000000000000000000000000000000000000000000000000000096" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "transactionIndex": "0x2e", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x14c", -// "removed": false -// } -// }, -// { -// "fromAddress": "0xf9875c63bae047fc819a3c2351caf2a4b957851a", -// "toAddress": "0x0000000000000000000000000000000000000000", -// "blockNum": "0x19d7421", -// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "value": 57436302, -// "category": "token", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000000000000000036c688e", -// "address": "0xe680e0317402ad3cb37d5ed9fc642702658ef57f" -// }, -// "log": { -// "address": "0xe680e0317402ad3cb37d5ed9fc642702658ef57f", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x000000000000000000000000f9875c63bae047fc819a3c2351caf2a4b957851a", -// "0x0000000000000000000000000000000000000000000000000000000000000000" -// ], -// "data": "0x00000000000000000000000000000000000000000000000000000000036c688e", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "transactionIndex": "0x9", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x64", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x51bbd64ee99038580481df9605bff93a5921e238", -// "blockNum": "0x19d7421", -// "hash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", -// "value": 8.369, -// "asset": "Sunflower Land", -// "category": "token", -// "rawContract": { -// "rawValue": "0x0000000000000000000000000000000000000000000000007424a928bd3e8000", -// "address": "0xd1f9c58e33933a993a3891f8acfe05a68e1afc05", -// "decimals": 18 -// }, -// "log": { -// "address": "0xd1f9c58e33933a993a3891f8acfe05a68e1afc05", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x00000000000000000000000051bbd64ee99038580481df9605bff93a5921e238" -// ], -// "data": "0x0000000000000000000000000000000000000000000000007424a928bd3e8000", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", -// "transactionIndex": "0x26", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x110", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x6bf218e7e39025f75a9cf138d574cdb84ce64639", -// "blockNum": "0x19d7421", -// "hash": "0x19779a02bb24e3fceadc4b027c1bfb47553cbc0596bfe1c28c50be760a824994", -// "erc721TokenId": "0x20", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0x3926480d67aece1f5f314f8daa66fe33ceca083e" -// }, -// "log": { -// "address": "0x3926480d67aece1f5f314f8daa66fe33ceca083e", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000006bf218e7e39025f75a9cf138d574cdb84ce64639", -// "0x0000000000000000000000000000000000000000000000000000000000000020" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x19779a02bb24e3fceadc4b027c1bfb47553cbc0596bfe1c28c50be760a824994", -// "transactionIndex": "0xa", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x75", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", -// "blockNum": "0x19d7421", -// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "erc721TokenId": "0x93", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" -// }, -// "log": { -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", -// "0x0000000000000000000000000000000000000000000000000000000000000093" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "transactionIndex": "0x2e", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x149", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x51bbd64ee99038580481df9605bff93a5921e238", -// "toAddress": "0x0000000000000000000000000000000000000000", -// "blockNum": "0x19d7421", -// "hash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", -// "erc1155Metadata": [ -// { -// "tokenId": "0x65", -// "value": "0x98a7d9b8314c0000" -// }, -// { -// "tokenId": "0x69", -// "value": "0x8ac7230489e80000" -// } -// ], -// "category": "erc1155", -// "rawContract": { -// "rawValue": "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000098a7d9b8314c00000000000000000000000000000000000000000000000000008ac7230489e80000", -// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422" -// }, -// "log": { -// "address": "0x22d5f9b75c524fec1d6619787e582644cd4d7422", -// "topics": [ -// "0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb", -// "0x000000000000000000000000070717e1bc4c6e46c22b0e0b8821e0ac1d4689c3", -// "0x00000000000000000000000051bbd64ee99038580481df9605bff93a5921e238", -// "0x0000000000000000000000000000000000000000000000000000000000000000" -// ], -// "data": "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000098a7d9b8314c00000000000000000000000000000000000000000000000000008ac7230489e80000", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xac39defc17c7a268b33cc4b8df9a232fad4b9a0a28f1d446bbcca04619ba13d1", -// "transactionIndex": "0x26", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x10f", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x80ff4e4153883d770204607eb4af9994739c72dc", -// "toAddress": "0x0000000000000000000000000000000000000000", -// "blockNum": "0x19d7421", -// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "value": 1.1222849947116925e+21, -// "category": "token", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000003cd6d54091cd9336f9", -// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454" -// }, -// "log": { -// "address": "0x225084d30cc297f3b177d9f93f5c3ab8fb6a1454", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x00000000000000000000000080ff4e4153883d770204607eb4af9994739c72dc", -// "0x0000000000000000000000000000000000000000000000000000000000000000" -// ], -// "data": "0x00000000000000000000000000000000000000000000003cd6d54091cd9336f9", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "transactionIndex": "0x9", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x44", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", -// "blockNum": "0x19d7421", -// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "erc721TokenId": "0x94", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" -// }, -// "log": { -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", -// "0x0000000000000000000000000000000000000000000000000000000000000094" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "transactionIndex": "0x2e", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x14a", -// "removed": false -// } -// }, -// { -// "fromAddress": "0xf715beb51ec8f63317d66f491e37e7bb048fcc2d", -// "toAddress": "0xe0036fb4b5a3b232acfc01fec3bd1d787a93da75", -// "blockNum": "0x19d7421", -// "hash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", -// "value": 0.00085, -// "asset": "WETH", -// "category": "token", -// "rawContract": { -// "rawValue": "0x000000000000000000000000000000000000000000000000000305120c0f2000", -// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", -// "decimals": 18 -// }, -// "log": { -// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x000000000000000000000000f715beb51ec8f63317d66f491e37e7bb048fcc2d", -// "0x000000000000000000000000e0036fb4b5a3b232acfc01fec3bd1d787a93da75" -// ], -// "data": "0x000000000000000000000000000000000000000000000000000305120c0f2000", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", -// "transactionIndex": "0x8", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x3a", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x1111111254fb6c44bac0bed2854e76f90643097d", -// "toAddress": "0xc590175e458b83680867afd273527ff58f74c02b", -// "blockNum": "0x19d7421", -// "hash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", -// "value": 555712363075697400, -// "category": "token", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", -// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7" -// }, -// "log": { -// "address": "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000001111111254fb6c44bac0bed2854e76f90643097d", -// "0x000000000000000000000000c590175e458b83680867afd273527ff58f74c02b" -// ], -// "data": "0x00000000000000000000000000000000000000000000000007b649732e6b7afb", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x08696572e9133c90c9bb31b30c8660caaf08288e31b1395148d837793bc7c2ba", -// "transactionIndex": "0x37", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x16f", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x7734280a4337f37fbf4651073db7c28c80b339e9", -// "blockNum": "0x19d7421", -// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "value": 2292228693313522200, -// "category": "token", -// "rawContract": { -// "rawValue": "0x0000000000000000000000000000000000000000000000001fcfa1da10e909df", -// "address": "0x8df3aad3a84da6b69a4da8aec3ea40d9091b2ac4" -// }, -// "log": { -// "address": "0x8df3aad3a84da6b69a4da8aec3ea40d9091b2ac4", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000007734280a4337f37fbf4651073db7c28c80b339e9" -// ], -// "data": "0x0000000000000000000000000000000000000000000000001fcfa1da10e909df", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "transactionIndex": "0x3", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x19", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0x8c3cffc0d194cee0dc4170834d8705099cd51505", -// "blockNum": "0x19d7421", -// "hash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "erc721TokenId": "0x97", -// "category": "token", -// "rawContract": { -// "rawValue": "0x", -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4" -// }, -// "log": { -// "address": "0x69c941715e514c46f6c10e20be0961523652d1f4", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x0000000000000000000000008c3cffc0d194cee0dc4170834d8705099cd51505", -// "0x0000000000000000000000000000000000000000000000000000000000000097" -// ], -// "data": "0x", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xcb077234fb8ae0036db65295e80b9bcd1a71489f3bc8a1a590fcd3d5f89564ae", -// "transactionIndex": "0x2e", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x14d", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0xb7f575de9deac0180dfbb9020f42a19ad6a2c0dd", -// "blockNum": "0x19d7421", -// "hash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "value": 7962164689, -// "category": "token", -// "rawContract": { -// "rawValue": "0x00000000000000000000000000000000000000000000000000000001da94fdd1", -// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f" -// }, -// "log": { -// "address": "0x1a13f4ca1d028320a707d99520abfefca3998b7f", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x000000000000000000000000b7f575de9deac0180dfbb9020f42a19ad6a2c0dd" -// ], -// "data": "0x00000000000000000000000000000000000000000000000000000001da94fdd1", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x9bb3e15d782f912bb76a5ea04f21c6a203d429b63ad939adcaf305c9303dbb02", -// "transactionIndex": "0x3", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x16", -// "removed": false -// } -// }, -// { -// "fromAddress": "0xf715beb51ec8f63317d66f491e37e7bb048fcc2d", -// "toAddress": "0x5b3256965e7c3cf26e11fcaf296dfc8807c01073", -// "blockNum": "0x19d7421", -// "hash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", -// "value": 0.0002125, -// "asset": "WETH", -// "category": "token", -// "rawContract": { -// "rawValue": "0x0000000000000000000000000000000000000000000000000000c1448303c800", -// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", -// "decimals": 18 -// }, -// "log": { -// "address": "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x000000000000000000000000f715beb51ec8f63317d66f491e37e7bb048fcc2d", -// "0x0000000000000000000000005b3256965e7c3cf26e11fcaf296dfc8807c01073" -// ], -// "data": "0x0000000000000000000000000000000000000000000000000000c1448303c800", -// "blockNumber": "0x19d7421", -// "transactionHash": "0xbe50d0bf34074b35f6ff85ad6c975a4dc1c1ef14f05b60dedc6315bc756689fe", -// "transactionIndex": "0x8", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x39", -// "removed": false -// } -// }, -// { -// "fromAddress": "0x0000000000000000000000000000000000000000", -// "toAddress": "0xf9875c63bae047fc819a3c2351caf2a4b957851a", -// "blockNum": "0x19d7421", -// "hash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "value": 140189, -// "category": "token", -// "rawContract": { -// "rawValue": "0x000000000000000000000000000000000000000000000000000000000002239d", -// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9" -// }, -// "log": { -// "address": "0xd051605e07c2b526ed9406a555601aa4db8490d9", -// "topics": [ -// "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", -// "0x0000000000000000000000000000000000000000000000000000000000000000", -// "0x000000000000000000000000f9875c63bae047fc819a3c2351caf2a4b957851a" -// ], -// "data": "0x000000000000000000000000000000000000000000000000000000000002239d", -// "blockNumber": "0x19d7421", -// "transactionHash": "0x3b23a37c645fc12f5e927fc9c60efa5c47b177d400d132f782af265543d9dfa8", -// "transactionIndex": "0x9", -// "blockHash": "0xa35a5646b27565d691f0e1516603bc8e5841f4ab27e7bf1e66ab9fab68641f20", -// "logIndex": "0x5e", -// "removed": false -// } -// } -// ] -// } -// } diff --git a/apps/indexer/src/routes/alchemy.ts b/apps/indexer/src/routes/alchemy.ts index 182d3fca1..35797bbc7 100644 --- a/apps/indexer/src/routes/alchemy.ts +++ b/apps/indexer/src/routes/alchemy.ts @@ -4,6 +4,25 @@ import { addressActivityTask } from '@repo/trigger' import type { Request, Response } from 'express' import { appConfig } from '~/config' import { logger } from '~/lib/logger' +import { Network } from 'alchemy-sdk' +import { prodChains } from 'app-env' + + +const chainIdToNetwork: Record = { + 1: Network.ETH_MAINNET, + 137: Network.MATIC_MAINNET, + 42161: Network.ARB_MAINNET, + 10: Network.OPT_MAINNET, + 8453: Network.BASE_MAINNET, + 43114: Network.AVAX_MAINNET, + 56: Network.BNB_MAINNET +} + +const networks: Network[] = prodChains.map(chain => { + const network = chainIdToNetwork[chain.id] + if (!network) throw new Error(`Unsupported chain ID: ${chain.id}`) + return network +}) /** * Handles incoming Alchemy webhook requests. @@ -14,10 +33,14 @@ import { logger } from '~/lib/logger' export async function alchemyWebhook(req: Request, res: Response) { const evt = req.body as AlchemyWebhookEvent logger.info(`Alchemy webhook received: ${evt.id}`) + const auth = evt.type === 'ADDRESS_ACTIVITY' && networks.includes((evt.event).network) + // TODO: restore alchemy signature validation // if (!validateAlchemySignature(req)) return res.status(401).send('Unauthorized') // logger.info('Validated Alchemy webhook 😀') - // TODO: validate user is whitelisted + // TODO: validate addre is whitelisted + + const handle = await addressActivityTask.trigger(req.body) logger.info(`Triggered address activity task: ${JSON.stringify(handle)}`) diff --git a/apps/trigger/package.json b/apps/trigger/package.json index 742a2607d..05b948edc 100644 --- a/apps/trigger/package.json +++ b/apps/trigger/package.json @@ -9,10 +9,12 @@ "deploy:prod": "bunx trigger.dev@beta deploy --env prod" }, "dependencies": { + "@repo/alchemy": "workspace:*", + "@trigger.dev/sdk": "3.0.0-beta.55", + "alchemy-sdk": "^3.4.1", "app-contracts": "workspace:*", "app-env": "workspace:*", "app-lib": "workspace:*", - "@trigger.dev/sdk": "3.0.0-beta.55", "viem": "latest" } } diff --git a/apps/trigger/src/trigger/activity.ts b/apps/trigger/src/trigger/activity.ts index 30580bfa8..881fe5ee3 100644 --- a/apps/trigger/src/trigger/activity.ts +++ b/apps/trigger/src/trigger/activity.ts @@ -1,17 +1,49 @@ +import { AlchemyWebhookEvent } from '@repo/alchemy' import { logger, task } from '@trigger.dev/sdk/v3' -import { getErrorMessage } from 'app-lib' // AlchemyWebhookEvent export const addressActivityTask = task({ id: 'address-activity', - run: async (payload: any, { ctx }) => { + run: async (payload: AlchemyWebhookEvent) => { try { - logger.log('Address activity', { payload, ctx }) + + const activity:Activity = payload.event.activity[0] + console.log(activity) + } catch (error) { logger.error('Error processing address activity', { - error: getErrorMessage(error), + error: (error as Error).message, }) throw error } }, }) + +interface Activity { + fromAddress: string + toAddress: string + blockNum: string + hash: string + value: number + asset: string + category: string + rawContract: { + rawValue: string + decimals: number + } +} + +// Example usage: +// const activity: Activity = { +// fromAddress: "0x6f76670a66e7909af9b76f0d84e39317fcc0b2e1", +// toAddress: "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359", +// blockNum: "0x3a1bef5", +// hash: "0x91dd89c417ee1b95cc792c28512707869eeaa638418594220b83ad06d62bebab", +// value: 0, +// asset: "MATIC", +// category: "external", +// rawContract: { +// rawValue: "0x0", +// decimals: 18 +// } +// } \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 9ea43eec393a2453b119e965bae2d84ba78bdc39..10ebdb1fd1e6d540cd54c578fc55e58fc25a5e5e 100755 GIT binary patch delta 19993 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 delta 19857 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

xP{2lxQ{1f~N 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 diff --git a/packages/app-env/src/chains.ts b/packages/app-env/src/chains.ts index ee618c150..f5f9653fb 100644 --- a/packages/app-env/src/chains.ts +++ b/packages/app-env/src/chains.ts @@ -1,23 +1,13 @@ import type { Chain } from 'viem' import { arbitrum, - aurora, avalanche, base, bsc, - celo, - cronos, - fantom, - gnosis, - harmonyOne, - kava, mainnet, - metis, - moonbeam, optimism, polygon, sepolia, - zkSync, } from 'viem/chains' export const eosEvmTestnet: Chain = { @@ -41,26 +31,19 @@ export const eosEvmTestnet: Chain = { testnet: true, } -const prodChains: Chain[] = [ - arbitrum, - avalanche, +export const prodChains: Chain[] = [ base, - celo, - mainnet, + arbitrum, optimism, polygon, - zkSync, - bsc, - fantom, - moonbeam, - cronos, - kava, - metis, - gnosis, - aurora, - harmonyOne, + mainnet, // Ethereum + avalanche, + bsc, // BNB Chain ] -const devChains: Chain[] = [eosEvmTestnet, sepolia] + +// Note: Solana is not included as it's not an EVM-compatible chain and not supported by viem + +export const devChains: Chain[] = [eosEvmTestnet, sepolia] // note: use .entries() to get an array export const appChains = { From 50340757120ec88d35e7d7ace5faf75f609a9c17 Mon Sep 17 00:00:00 2001 From: Gabo Esquivel Date: Fri, 23 Aug 2024 01:52:24 -0600 Subject: [PATCH 5/6] wip(indexer): validate before triggering --- apps/alchemy/src/types.ts | 19 ++++++++++++++++ apps/indexer/src/config.ts | 8 +++++++ apps/indexer/src/routes/alchemy.ts | 32 +++++++++++++++++--------- apps/trigger/src/trigger/activity.ts | 34 ++-------------------------- 4 files changed, 50 insertions(+), 43 deletions(-) diff --git a/apps/alchemy/src/types.ts b/apps/alchemy/src/types.ts index 207c5b09a..7d84c5002 100644 --- a/apps/alchemy/src/types.ts +++ b/apps/alchemy/src/types.ts @@ -1,3 +1,4 @@ +import { Network } from 'alchemy-sdk' export interface AlchemyWebhookEvent { webhookId: string id: string @@ -11,3 +12,21 @@ export type AlchemyWebhookType = | 'DROPPED_TRANSACTION' | 'ADDRESS_ACTIVITY' +export interface AlchemyActivity { + fromAddress: string + toAddress: string + blockNum: string + hash: string + value: number + asset: string + category: string + rawContract: { + rawValue: string + decimals: number + } +} + +export interface AlchemyActivityEvent { + network: Network + activity: AlchemyActivity[] +} \ No newline at end of file diff --git a/apps/indexer/src/config.ts b/apps/indexer/src/config.ts index 88dd3f10b..52ba208f8 100644 --- a/apps/indexer/src/config.ts +++ b/apps/indexer/src/config.ts @@ -21,6 +21,13 @@ const envSchema = z.object({ (value): value is Address => isAddress(value), 'Invalid issuer address', ), + PRESALE_ADDRESS: z + .string() + .refine( + (value): value is Address => isAddress(value), + 'Invalid presale address', + ), + ALCHEMY_ACTIVITY_SIGNING_KEY: z.string().min(1), }) @@ -33,6 +40,7 @@ if (!parsedEnv.success) { } export const appConfig = { + presaleAddress: parsedEnv.data.PRESALE_ADDRESS, sentry: { dsn: parsedEnv.data.SENTRY_DSN, }, diff --git a/apps/indexer/src/routes/alchemy.ts b/apps/indexer/src/routes/alchemy.ts index 35797bbc7..d8d52f5b3 100644 --- a/apps/indexer/src/routes/alchemy.ts +++ b/apps/indexer/src/routes/alchemy.ts @@ -1,12 +1,12 @@ import crypto from 'crypto' -import type { AlchemyWebhookEvent } from '@repo/alchemy' +import type { AlchemyWebhookEvent } from '@repo/alchemy' import { addressActivityTask } from '@repo/trigger' +import { Network } from 'alchemy-sdk' +import { prodChains } from 'app-env' import type { Request, Response } from 'express' import { appConfig } from '~/config' import { logger } from '~/lib/logger' -import { Network } from 'alchemy-sdk' -import { prodChains } from 'app-env' - +import {AlchemyActivityEvent} from '@/Users/gaboesquivel/Code/smartsale/apps/alchemy/src/types'; const chainIdToNetwork: Record = { 1: Network.ETH_MAINNET, @@ -15,12 +15,12 @@ const chainIdToNetwork: Record = { 10: Network.OPT_MAINNET, 8453: Network.BASE_MAINNET, 43114: Network.AVAX_MAINNET, - 56: Network.BNB_MAINNET + 56: Network.BNB_MAINNET, } -const networks: Network[] = prodChains.map(chain => { +const networks: Network[] = prodChains.map((chain) => { const network = chainIdToNetwork[chain.id] - if (!network) throw new Error(`Unsupported chain ID: ${chain.id}`) + if (!network) throw new Error(`Unsupported chain ID: ${chain.id}`) return network }) @@ -33,14 +33,24 @@ const networks: Network[] = prodChains.map(chain => { export async function alchemyWebhook(req: Request, res: Response) { const evt = req.body as AlchemyWebhookEvent logger.info(`Alchemy webhook received: ${evt.id}`) - const auth = evt.type === 'ADDRESS_ACTIVITY' && networks.includes((evt.event).network) - - // TODO: restore alchemy signature validation + // TODO: restore alchemy signature validation // if (!validateAlchemySignature(req)) return res.status(401).send('Unauthorized') // logger.info('Validated Alchemy webhook 😀') - // TODO: validate addre is whitelisted + + const {network, activity} = evt.event + + // Validate before triggering + if ( + evt.type !== 'ADDRESS_ACTIVITY' || + !networks.includes(network) || + (activity.asset !== 'USDC' && activity.asset !== 'USDT') || + activity.toAddress === appConfig.presaleAddress + ) { + return res.status(401).send('Unauthorized') + } + // TODO: validate addres is whitelisted const handle = await addressActivityTask.trigger(req.body) logger.info(`Triggered address activity task: ${JSON.stringify(handle)}`) diff --git a/apps/trigger/src/trigger/activity.ts b/apps/trigger/src/trigger/activity.ts index 881fe5ee3..6edb0d06e 100644 --- a/apps/trigger/src/trigger/activity.ts +++ b/apps/trigger/src/trigger/activity.ts @@ -1,4 +1,4 @@ -import { AlchemyWebhookEvent } from '@repo/alchemy' +import type { AlchemyWebhookEvent, AlchemyActivity } from '@repo/alchemy' import { logger, task } from '@trigger.dev/sdk/v3' // AlchemyWebhookEvent @@ -6,10 +6,8 @@ export const addressActivityTask = task({ id: 'address-activity', run: async (payload: AlchemyWebhookEvent) => { try { - - const activity:Activity = payload.event.activity[0] + const activity: AlchemyActivity = payload.event.activity[0] console.log(activity) - } catch (error) { logger.error('Error processing address activity', { error: (error as Error).message, @@ -19,31 +17,3 @@ export const addressActivityTask = task({ }, }) -interface Activity { - fromAddress: string - toAddress: string - blockNum: string - hash: string - value: number - asset: string - category: string - rawContract: { - rawValue: string - decimals: number - } -} - -// Example usage: -// const activity: Activity = { -// fromAddress: "0x6f76670a66e7909af9b76f0d84e39317fcc0b2e1", -// toAddress: "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359", -// blockNum: "0x3a1bef5", -// hash: "0x91dd89c417ee1b95cc792c28512707869eeaa638418594220b83ad06d62bebab", -// value: 0, -// asset: "MATIC", -// category: "external", -// rawContract: { -// rawValue: "0x0", -// decimals: 18 -// } -// } \ No newline at end of file From 56aab01773e70e33c89a586bed2860ed030084f7 Mon Sep 17 00:00:00 2001 From: Gabo Esquivel Date: Fri, 23 Aug 2024 02:07:44 -0600 Subject: [PATCH 6/6] chore: add try catch Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- apps/alchemy/src/create.ts | 40 +++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/alchemy/src/create.ts b/apps/alchemy/src/create.ts index 7b5629cc8..9527522be 100644 --- a/apps/alchemy/src/create.ts +++ b/apps/alchemy/src/create.ts @@ -2,25 +2,29 @@ import { Alchemy, Network, WebhookType } from 'alchemy-sdk' import { appConfig } from './config' async function createAddressActivityNotification() { - const settings = { - authToken: appConfig.alchemyNotifyToken, - network: Network.MATIC_MAINNET, // Replace with your network. - } + try { + const settings = { + authToken: appConfig.alchemyNotifyToken, + network: Network.MATIC_MAINNET, // Replace with your network. + } - const alchemy = new Alchemy(settings) - const addressActivityWebhook = await alchemy.notify.createWebhook( - appConfig.alchemyActivityWebhookUrl, - WebhookType.ADDRESS_ACTIVITY, - { - addresses: [appConfig.presaleAddress], - network: Network.MATIC_MAINNET, - }, - ) - console.log('Address Activity Webhook Details:') - console.log(JSON.stringify(addressActivityWebhook, null, 2)) - console.log( - 'Alchemy Notify address activity notification created, go to https://dashboard.alchemy.com/notify to see details of your custom hook.', - ) + const alchemy = new Alchemy(settings) + const addressActivityWebhook = await alchemy.notify.createWebhook( + appConfig.alchemyActivityWebhookUrl, + WebhookType.ADDRESS_ACTIVITY, + { + addresses: [appConfig.presaleAddress], + network: Network.MATIC_MAINNET, + }, + ) + console.log('Address Activity Webhook Details:') + console.log(JSON.stringify(addressActivityWebhook, null, 2)) + console.log( + 'Alchemy Notify address activity notification created, go to https://dashboard.alchemy.com/notify to see details of your custom hook.', + ) + } catch (error) { + console.error('Failed to create address activity notification:', error) + } } createAddressActivityNotification()