Watch contracts

Monitor state changes for a specific smart contract

ContractsTrigger type triggers allow you to track state changes for a specific smart contract variable (exposed via getter function) or any kind of value returned by a view Solitidy/Viper function.

A simple example

Let's see how we can use a ContractTrigger to monitor state changes on Uniswap. We can use the getTokenToEthOutputPrice function to know how many MKR is 1 ETH worth. It is simple to create a trigger that sends us an email every time the ETH price drops below a certain threshold:

{
   "name":"ETH price drop",
   "type":"ContractsTrigger",
   "statement":{
      "contract":{
         "address":"0x09cabec1ead1c0ba254b09efb3ee13841712be14",
         "abi":[
            {
               "abi":"..."
            }
         ]
      },
      "method":{
         "name":"getTokenToEthOutputPrice"
      },
      "inputs":[
         {
            "type":"uint256",
            "name":"getTokenToEthOutputPrice",
         }
      ],
      "outputFilters":[
         {
            "condition":{
               "predicate":"SmallerThan",
               "attribute":"200"
            },
            "parameter":{
               "name":"eth_bought",
               "type":"uint256"
            }
         }
      ]
   },
   "actions":[
      {
         "type":"Email",
         "attributes":{
            "body":"On block number $BlockNumber$",
            "subject":"ETH PRICE DROP! last value was: $ReturnedValues$",
            "to":[
               "foo@bar.com",
               "bar@foo.com"
            ]
         }
      }
   ]
}

Here is a summary of the supported types and predicates:

Type

Supported predicates

int8...256, uint8...256

Eq, SmallerThan, BiggerThan

int8...256[N], uint8...256[N], address[N], string[N], bytes1...32[N]

Eq, SmallerThan, BiggerThan, IsIn*

address, string, bytes1...32, bool

Eq

It is also possible to define more complex data types as inputs to our trigger this way:

{
   "inputs":[
      {
         "type":"tuple[]",
         "name":"orders",
         "components":[
            {
               "name":"makerAddress",
               "type":"address",
               "value":"0x..."
            },
            {
               "name":"takerAddress",
               "type":"address",
               "value":"0x..."
            },
            {
               "name":"feeRecipientAddress",
               "type":"address",
               "value":"0x..."
            }
         ]
      },
      {
         "type":"address",
         "name":"token",
         "value":"0x..."
      },
      {
         "type":"address[4]",
         "name":"tradeAddresses",
         "value":[
            "0x...",
            "0x...",
            "0x...",
            "0x..."
         ]
      }
   ]
}

Last updated