Skip to content

SNS / SQS

rindexer allows you to configure AWS SNS and AWS SQS to stream any data to. This goes under the contracts section of the YAML configuration file.

Find out more about Simple Notification Service and Simple Queue Service

Configuration with rindexer

sns topics property accepts an array allowing you to split up the streams any way you wish.

Example

rindexer.yaml
name: RocketPoolETHIndexer
description: My first rindexer project
repository: https://github.com/joshstevens19/rindexer
project_type: no-code
networks:
- name: ethereum
  chain_id: 1
  rpc: https://mainnet.gateway.tenderly.co
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config: 
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks: 
            - ethereum
          events: 
            - event_name: Transfer

Response

The response sent to you is already decoded and parsed into a JSON stringify object.

  • event_name - The name of the event
  • event_data - The event data which has all the event fields decoded and the transaction information which is under transaction_information
  • network - The network the event was emitted on

For example a transfer event would look like:

{
    "event_name": "Transfer",
    "event_data": {
        "from": "0x0338ce5020c447f7e668dc2ef778025ce3982662",
        "to": "0x0338ce5020c447f7e668dc2ef778025ce3982662",
        "value": "1000000000000000000",
        "transaction_information": {
            "address": "0xae78736cd615f374d3085123a210448e74fc6393",
            "block_hash": "0x8461da7a1d4b47190a01fa6eae219be40aacffab0dd64af7259b2d404572c3d9",
            "block_number": "18718011",
            "log_index": "0",
            "network": "ethereum",
            "transaction_hash": "0x145c6705ffbf461e85d08b4a7f5850d6b52a7364d93a057722ca1194034f3ba4",
            "transaction_index": "0"
        }
    },
    "network": "ethereum"
}

aws_config

This is the AWS configuration for the SNS client.

region

The AWS region to connect to.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config: 
        region: us-east-1

access_key

The AWS access key to connect to.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config: 
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}

secret_key

The AWS secret key to connect to.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config: 
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}

session_token

The AWS session token to connect to.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config: 
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        session_token: ${AWS_SESSION_TOKEN}

topics

This is an array of topics you want to stream to this sns.

topic_arn

This is your SNS topic arn. It supports first-in-first-out and standard topics. You can read about the different here here.

standard
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"

networks

This is an array of networks you want to stream to this webhook.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks: 
            - ethereum

events

This is an array of events you want to stream to this SNS topic.

event_name

This is the name of the event you want to stream to this SNS topic, must match the ABI event name.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks:
            - ethereum
          events: 
            - event_name: Transfer

conditions

This accepts an array of conditions you want to apply to the event data before streaming to this SNS topic.

You may want to filter on the stream based on the event data, if the event data has not got an index on the on the solidity event you can not filter it over the logs. The conditions filter is here to help you with this, based on your ABI you can filter on the event data.

rindexer has enabled a special syntax which allows you to define on your ABI fields what you want to filter on.

  1. > - higher then (for numbers only)
  2. < - lower then (for numbers only)
  3. = - equals
  4. >= - higher then or equals (for numbers only)
  5. <= - lower then or equals (for numbers only)
  6. || - or
  7. && - and

So lets look at an example lets say i only want to get transfer events which are higher then 2000000000000000000 RETH wei

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks:
            - ethereum
          events: 
            - event_name: Transfer
              conditions: 
                - "value": ">=2000000000000000000"

We use the ABI input name value to filter on the value field, you can find these names in the ABI file.

{
    "anonymous":false,
    "inputs":[
      {
        "indexed":true,
        "internalType":"address",
        "name":"from",
        "type":"address"
      },
      {
        "indexed":true,
        "internalType":"address",
        "name":"to",
        "type":"address"
      },
      {
        "indexed":false,
        "internalType":"uint256",
        "name":"value", 
        "type":"uint256"
      }
    ],
    "name":"Transfer",
    "type":"event"
}

You can use the || or && to combine conditions.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks:
            - ethereum
          events: 
            - event_name: Transfer
              conditions: 
                - "value": ">=2000000000000000000 && value <=4000000000000000000"

You can use the = to filter on other aspects like the from or to address.

rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks:
            - ethereum
          events: 
            - event_name: Transfer
              conditions: 
                - "from": "0x0338ce5020c447f7e668dc2ef778025ce3982662 || 0x0338ce5020c447f7e668dc2ef778025ce398266u"
                - "value": ">=2000000000000000000 || value <=4000000000000000000"

If you have a tuple and you want to get that value you just use the object notation.

For example lets say we want to only get the events for profileId from the quoteParams tuple which equals 1:

{
     "anonymous": false,
     "inputs": [
       {
         "components": [
           {
             "internalType": "uint256",
             "name": "profileId", 
             "type": "uint256"
           },
           ...
         ],
         "indexed": false,
         "internalType": "struct Types.QuoteParams",
         "name": "quoteParams", 
         "type": "tuple"
       },
       ...
     ],
     "name": "QuoteCreated", 
     "type": "event"
}
rindexer.yaml
...
contracts:
- name: RocketPoolETH
  details:
  - network: ethereum
    address: "0xae78736cd615f374d3085123a210448e74fc6393"
    start_block: "18600000"
    end_block: "18600181"
  abi: "./abis/RocketTokenRETH.abi.json"
  include_events:
  - Transfer
  streams: 
    sns: 
      aws_config:
        region: us-east-1
        access_key: ${AWS_ACCESS_KEY_ID}
        secret_key: ${AWS_SECRET_ACCESS_KEY}
        # session_token is optional
        session_token: ${AWS_SESSION_TOKEN}
      topics: 
        - topic_arn: "arn:aws:sns:us-east-1:664643779377:test"
          networks:
            - ethereum
          events: 
            - event_name: Transfer
              conditions: 
                - "quoteParams.profileId": "=1"