OMG Network Watcher API

GET
/alarm.get

Note: Service operator alarms.

Response Body

application/json

application/json

curl -X GET "https://example.com/alarm.get"
{
  "data": [
    {
      "disk_almost_full": "/dev/null",
      "ethereum_connection_error": {},
      "ethereum_stalled_sync": {},
      "system_memory_high_watermark": []
    }
  ]
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
GET
/configuration.get

Note: Configuration values.

Response Body

application/json

application/json

curl -X GET "https://example.com/configuration.get"
{
  "data": [
    {
      "deposit_finality_margin": 10,
      "contract_semver": "1.0.0.1+a1s29s8"
    }
  ]
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/status.get

The most critical function of the Watcher is to monitor the ChildChain and report dishonest activity. The user must call the /status.get endpoint periodically to check. Any situation that requires the user to either exit or challenge an invalid exit will be included in the byzantine_events field.

Response Body

application/json

application/json

curl -X POST "https://example.com/status.get"
{
  "data": {
    "last_validated_child_block_timestamp": 1558535130,
    "last_validated_child_block_number": 10000,
    "last_mined_child_block_timestamp": 1558535190,
    "last_mined_child_block_number": 11000,
    "last_seen_eth_block_timestamp": 1558535190,
    "last_seen_eth_block_number": 4427041,
    "contract_addr": {
      "plasma_framework": "0x44de0ec539b8c4a4b530c78620fe8320167f2f74"
    },
    "eth_syncing": true,
    "byzantine_events": [
      {
        "event": "invalid_exit",
        "details": {
          "eth_height": 615440,
          "utxo_pos": 10000000010000000,
          "owner": "0xb3256026863eb6ae5b06fa396ab09069784ea8ea",
          "currency": "0x0000000000000000000000000000000000000000",
          "amount": 100,
          "root_chain_txhash": "0xde8210dd179e4a067c5649ebeee8871e0f258fecbd1eb02e11db88121bb8de01",
          "spending_txhash": "0x21aee8dcc74d6b309f6e98a967a6aa6002432f98a5bc13c75529dbe228e04451",
          "scheduled_finalization_time": 1588144725
        }
      },
      {
        "event": "unchallenged_exit",
        "details": {
          "eth_height": 615440,
          "utxo_pos": 10000000010000000,
          "owner": "0xb3256026863eb6ae5b06fa396ab09069784ea8ea",
          "currency": "0x0000000000000000000000000000000000000000",
          "amount": 100,
          "root_chain_txhash": "0xde8210dd179e4a067c5649ebeee8871e0f258fecbd1eb02e11db88121bb8de01",
          "spending_txhash": "0x21aee8dcc74d6b309f6e98a967a6aa6002432f98a5bc13c75529dbe228e04451",
          "scheduled_finalization_time": 1588144725
        }
      },
      {
        "event": "invalid_block",
        "details": {
          "blockhash": "0x0017372421f9a92bedb7163310918e623557ab5310befc14e67212b660c33bec",
          "blknum": 10000,
          "error_type": "tx_execution"
        }
      },
      {
        "event": "block_withholding",
        "details": {
          "hash": "0x0017372421f9a92bedb7163310918e623557ab5310befc14e67212b660c33bec",
          "blknum": 10000
        }
      },
      {
        "event": "noncanonical_ife",
        "details": {
          "txbytes": "0x0017372421f9a92bedb7163310918e623557ab5310befc14e67212b660c33bec"
        }
      },
      {
        "event": "invalid_ife_challenge",
        "details": {
          "txbytes": "0x0017372421f9a92bedb7163310918e623557ab5310befc14e67212b660c33bec"
        }
      },
      {
        "event": "piggyback_available",
        "details": {
          "txbytes": "0x0017372421f9a92bedb7163310918e623557ab5310befc14e67212b660c33bec",
          "available_outputs": [
            {
              "index": 0,
              "address": "0xb3256026863eb6ae5b06fa396ab09069784ea8ea"
            },
            {
              "index": "1,",
              "address": "0x488f85743ef16cfb1f8d4dd1dfc74c51dc496434"
            }
          ],
          "available_inputs": [
            {
              "index": 0,
              "address": "0xb3256026863eb6ae5b06fa396ab09069784ea8ea"
            }
          ]
        }
      },
      {
        "event": "invalid_piggyback",
        "details": {
          "txbytes": "0x0017372421f9a92bedb7163310918e623557ab5310befc14e67212b660c33bec",
          "inputs": [
            1
          ],
          "outputs": [
            0
          ]
        }
      },
      {
        "event": "ethereum_stalled_sync",
        "details": {
          "eth_height": 615440,
          "synced_at": "2020-02-07T10:10:10+00:00"
        }
      }
    ],
    "in_flight_txs": [
      {
        "txhash": "0xbdf562c24ace032176e27621073df58ce1c6f65de3b5932343b70ba03c72132d",
        "txbytes": "0x3eb6ae5b06f3...",
        "input_addresses": [
          "0x1234..."
        ],
        "ouput_addresses": [
          "0x1234...",
          "0x7890..."
        ]
      }
    ],
    "in_flight_exits": [
      {
        "txhash": "0x5df13a6bf96dbcf6e66d8babd6b55bd40d64d4320c3b115364c6588fc18c2a21",
        "txbytes": "0xf3170101c094...",
        "eth_height": 615441,
        "piggybacked_inputs": [
          1
        ],
        "piggybacked_outputs": [
          0,
          1
        ]
      }
    ],
    "services_synced_heights": [
      {
        "service": "block_getter",
        "height": 4427041
      },
      {
        "service": "challenges_responds_processor",
        "height": 4427029
      },
      {
        "service": "competitor_processor",
        "height": 4427029
      },
      {
        "service": "depositor",
        "height": 4427031
      },
      {
        "service": "exit_challenger",
        "height": 4427029
      },
      {
        "service": "exit_finalizer",
        "height": 4427029
      },
      {
        "service": "exit_processor",
        "height": 4427029
      },
      {
        "service": "ife_exit_finalizer",
        "height": 4427029
      },
      {
        "service": "in_flight_exit_processor",
        "height": 4427029
      },
      {
        "service": "piggyback_challenges_processor",
        "height": 4427029
      },
      {
        "service": "piggyback_processor",
        "height": 4427029
      },
      {
        "service": "root_chain_height",
        "height": 4427041
      }
    ]
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/account.get_exitable_utxos

Note: this is a performance intensive call and should only be used if the chain is byzantine and the user needs to retrieve utxo information to be able to exit. Normally an application should use the Informational API's Account - Get Utxos instead. This version is provided in case the Informational API is not available.

Request Body

application/json

HEX-encoded address of the account

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/account.get_exitable_utxos" \  -H "Content-Type: application/json" \  -d '{    "address": "0xb3256026863eb6ae5b06fa396ab09069784ea8ea"  }'
{
  "data": [
    {
      "blknum": 123000,
      "txindex": 111,
      "oindex": 0,
      "otype": 1,
      "utxo_pos": 123000001110000,
      "owner": "0xb3256026863eb6ae5b06fa396ab09069784ea8ea",
      "currency": "0x0000000000000000000000000000000000000000",
      "amount": 10
    }
  ]
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/utxo.get_challenge_data

Gets challenge data for a given utxo exit.

Request Body

application/json

Utxo position (encoded as single integer, the way contract represents them)

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/utxo.get_challenge_data" \  -H "Content-Type: application/json" \  -d '{    "utxo_pos": 10000000010000000  }'
{
  "data": {
    "exit_id": 1.7176118930141594e+45,
    "input_index": 0,
    "sig": "0x6bfb9b2dbe32...",
    "txbytes": "0x3eb6ae5b06f3...",
    "exiting_tx": "0x6d6bda6bd6d6..."
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/utxo.get_exit_data

Gets exit data for a given utxo.

Request Body

application/json

Utxo position (encoded as single integer, the way contract represents them)

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/utxo.get_exit_data" \  -H "Content-Type: application/json" \  -d '{    "utxo_pos": 10000000010000000  }'
{
  "data": {
    "proof": "0xcedb8b31d1e4...",
    "txbytes": "0x3eb6ae5b06f3...",
    "utxo_pos": 10000000010000000
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/transaction.submit

Watcher passes signed transaction to the child chain only if it's secure, e.g. Watcher is fully synced, all operator blocks have been verified, transaction doesn't spend funds not yet mined...

Request Body

application/json

Signed transaction RLP-encoded to bytes and HEX-encoded to string

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/transaction.submit" \  -H "Content-Type: application/json" \  -d '{    "transaction": "0xf8d083015ba98080808080940000..."  }'
{
  "data": {
    "blknum": 123000,
    "txindex": 111,
    "txhash": "0xbdf562c24ace032176e27621073df58ce1c6f65de3b5932343b70ba03c72132d"
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/in_flight_exit.get_data

Exit data are arguments to startInFlightExit root chain contract function.

Request Body

application/json

In-flight transaction bytes body

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/in_flight_exit.get_data" \  -H "Content-Type: application/json" \  -d '{    "txbytes": "0xf3170101c0940000..."  }'
{
  "data": {
    "in_flight_tx": "0xf3170101c0940000...",
    "input_txs": [
      "0xa3470101c0940000..."
    ],
    "input_txs_inclusion_proofs": [
      "0xcedb8b31d1e4..."
    ],
    "in_flight_tx_sigs": [
      "0x6bfb9b2dbe32..."
    ],
    "input_utxos_pos": [
      300010002001
    ]
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/in_flight_exit.get_competitor

Note that if the competing transaction has not been put into a block competing_tx_pos and competing_proof will not be returned.

Request Body

application/json

In-flight transaction bytes body

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/in_flight_exit.get_competitor" \  -H "Content-Type: application/json" \  -d '{    "txbytes": "0xf3170101c0940000..."  }'
{
  "data": {
    "in_flight_txbytes": "0xf3170101c0940000...",
    "in_flight_input_index": 1,
    "competing_txbytes": "0x5df13a6bee20000...",
    "competing_input_index": 1,
    "competing_sig": "0xa3470101c0940000...",
    "competing_tx_pos": 26000003920000,
    "competing_proof": "0xcedb8b31d1e4...",
    "input_tx": "0xaaa70101c0940000...",
    "input_utxo_pos": 300010002001
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/in_flight_exit.prove_canonical

To respond to a challenge to an in-flight exit, this proves that the transaction has been put into a block (and therefore is canonical).

Request Body

application/json

In-flight transaction bytes body

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/in_flight_exit.prove_canonical" \  -H "Content-Type: application/json" \  -d '{    "txbytes": "0xf3170101c0940000..."  }'
{
  "data": {
    "in_flight_txbytes": "0xf3170101c0940000...",
    "in_flight_tx_pos": 26000003920000,
    "in_flight_proof": "0xcedb8b31d1e4..."
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/in_flight_exit.get_input_challenge_data

To respond to invalid piggybacked input in non-canonical in-flight transaction provides data needed to challenge it, e.g. transaction that spent this input and signature.

Request Body

application/json

In-flight transaction bytes and invalid input index

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/in_flight_exit.get_input_challenge_data" \  -H "Content-Type: application/json" \  -d '{    "txbytes": "0xf3170101c0940000...",    "input_index": 1  }'
{
  "data": {
    "in_flight_txbytes": "0xf3170101c0940000...",
    "in_flight_input_index": 1,
    "spending_txbytes": "0x5df13a6bee20000...",
    "spending_input_index": 1,
    "spending_sig": "0xa3470101c0940000...",
    "input_tx": "0xaaa70101c0940000...",
    "input_utxo_pos": 300010002001
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}
POST
/in_flight_exit.get_output_challenge_data

To respond to invalid piggybacked output in canonical in-flight transaction provides data needed to challenge it, e.g. in-flight transaction inclusion proof, transaction that spent this output and signature.

Request Body

application/json

In-flight transaction bytes and invalid output index

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://example.com/in_flight_exit.get_output_challenge_data" \  -H "Content-Type: application/json" \  -d '{    "txbytes": "0xf3170101c0940000...",    "output_index": 0  }'
{
  "data": {
    "in_flight_txbytes": "0xf3170101c0940000...",
    "in_flight_output_pos": 21000634002,
    "in_flight_proof": "0xcedb8b31d1e4...",
    "spending_txbytes": "0x5df13a6bee20000...",
    "spending_input_index": 1,
    "spending_sig": "0xa3470101c0940000..."
  }
}
{
  "success": false,
  "data": {
    "object": "error",
    "code": "server:internal_server_error",
    "description": "Something went wrong on the server",
    "messages": {
      "error_key": "error_reason"
    }
  }
}