# Txn Event Search
Findora transactions have metadata called events which have a field `type` and a list of attributes for e.g.
```
{
"type": "tx",
"attributes": [
{
"key": "cHJlaGFzaA==",
"value": "ODNjMmVjNjc1YTI0MGJmMDBkMTQ5ZTA2ZjkxMTM3YzRjNzEzMjkwZGVjMDEzYmEyODI3MWRiMWU0ZTlmNDBjYg=="
},
{
"key": "dGltZXN0YW1w",
"value": "MTY1MzYwNzY0MA=="
}
]
}
```
Wallet wants an api to query the events base on the event type and its attributes.
For example the search query would be like
type = commitment.created
has_attribute = G96MKTtr5pQ1ou6iRgvHPqLELtgrYHai89HAnvfubNdd=y
which would return all matching txns like
```
{
"jsonrpc": "2.0",
"id": -1,
"result": {
"txs": [
{
"hash": "FFA644AD03F82D60D037C1AF07311988475D90A0EB20892601690447D009A1F1",
"height": "78",
"index": 0,
"tx_result": {
"code": 0,
"data": null,
"log": "",
"info": "",
"gasWanted": "0",
"gasUsed": "0",
"events": [
{
"type": "tx",
"attributes": [
{
"key": "cHJlaGFzaA==",
"value": "ODNjMmVjNjc1YTI0MGJmMDBkMTQ5ZTA2ZjkxMTM3YzRjNzEzMjkwZGVjMDEzYmEyODI3MWRiMWU0ZTlmNDBjYg=="
},
{
"key": "dGltZXN0YW1w",
"value": "MTY1MzYwNzY0MA=="
}
]
},
{
"type": "addr",
"attributes": [
{
"key": "ZnJvbQ==",
"value": "W10="
},
{
"key": "dG8=",
"value": "W10="
}
]
},
{
"type": "nullifier.used",
"attributes": [
{
"key": "SjQ0QXNObXFoZm9QYUxGU1A1a1lCbkN3eDdqZ0pWZTNMWDVGNEN3S2djY1I=",
"value": "eQ=="
},
{
"key": "NWFIQ3JQRHNrbTZQaTRNbnJWa1FVaHo5cDZvTVl2cmdSd3AzQjcxclZUZUo=",
"value": "eQ=="
},
{
"key": "MmpGYlJqOXBCTm1aOWtWQlRnaTdoWThOTWs5SnJuS1U5Y2JWV3BEM01yYU0=",
"value": "eQ=="
}
]
},
{
"type": "commitment.created",
"attributes": [
{
"key": "Rzk2TUtUdHI1cFExb3U2aVJndkhQcUxFTHRncllIYWk4OUhBbnZmdWJOZGQ=",
"value": "eQ=="
},
{
"key": "RnFTcnQ2Vm1RN2FUdzVCNkh5NlFTSHVxV1MyaVFlSmFLWnA5NE5QZXlxeXM=",
"value": "eQ=="
},
{
"key": "N3NnRHRZWWRxbUZDRE14R2NmRFQ2RTVTU3JaMlBENlpVQmtDRGI2dVROYUI=",
"value": "eQ=="
},
{
"key": "NVFydEtiRHBEWEdpY0VMWEdOTExXTTFIenBaaHpFUXI0Q0d4NHhvWlZtd3g=",
"value": "eQ=="
},
{
"key": "SHdzdHhFZlhpaFhiMzRVZFF5Q2hVZ2ZzdHV0YUFlaTVkdHF6dnpKSGdDNnA=",
"value": "eQ=="
},
{
"key": "MjltdkZqMmIyaldhRDhDeFRlUVVRWnM3dHhEUTdQQWt6OVVzNjVlVGFUbWM=",
"value": "eQ=="
}
]
}
],
"codespace": ""
},
"tx": "eyJib2R5Ijp7Im5vX3JlcGxheV90b2tlbiI6W1s1MywxNDQsMjExLDE3OCwyMzAsMTEyLDIwMSw2OV0sMjJdLCJvcGVyYXRpb25zIjpbeyJUcmFuc2ZlckFub25Bc3NldCI6eyJub3RlIjp7ImJvZHkiOnsiaW5wdXRzIjpbIl9WOEJNakhCeTRjdGVOdkZhSUVoaVhEbVpEUXhRSk8xay1XN3ZlS0R0U289IiwiUV9VOG1MSVB5WlRTbDNjYzVONTNFOGdGUTJaR1NaVDM3enlHeV91Uk9Rcz0iLCJHYTZVOXhmM2h3dS03bUVkdHBtcF8yUkp3ZWtHRjkzdHlSOTY5VXc1ZG5JPSJdLCJvdXRwdXRzIjpbeyJjb21taXRtZW50IjoiNFBIX18xTWtSWnNmNXp2TDNzbEFicFA2ZTVTM240LTNTMmhicmJucGgxQT0ifSx7ImNvbW1pdG1lbnQiOiIzR3k4WHBRd3dKb2dVblVCdmM2SFZHUE0zbFBraV83WXJZcmVRNFhWTERJPSJ9LHsiY29tbWl0bWVudCI6IlppR0N2a2lZSVJmWmhBZ2dmWVNjYmlNVjNDUVNhcV9nckNHZUhLTU84bWc9In0seyJjb21taXRtZW50IjoiUVl1QzR5ZDUzcWtqYUplUTV4UGg4V0dobmFSS1Vmc29Tb3hmUWJQTG1BTT0ifSx7ImNvbW1pdG1lbnQiOiItOG5uQ2d1Q3otNTdXNHdaalA3cHNaRktBZTBFSWtiN2ViQ1VieEx6aEZVPSJ9LHsiY29tbWl0bWVudCI6IkVSc2ZYb1BhOE4zamVBbHRJWVZ5WVlNMnFldVoyM1hGRUlYSk5Cb3pDQ3M9In1dLCJtZXJrbGVfcm9vdCI6Imo4SlB0OEVHRmN6YmwwbkpuUkRTZk5oQ2ZwcDBpQXYtY2JJMTFacVY5SEE9IiwibWVya2xlX3Jvb3RfdmVyc2lvbiI6MjIsIm93bmVyX21lbW9zIjpbeyJibGluZF9zaGFyZSI6IkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9IiwibG9jayI6eyJjaXBoZXJ0ZXh0IjoiY24tRTBxRTZUSk8wMW1tMUxEc3NsQk1qOGViREo3dXNKX0NjM1pOaVYtWUNKbi0xcVlqM0k0QmlGalQ5QnJfYkR1bUpLLU5MdlVydkxOenA1cHBNaEp1c3E4REI3dkZnIiwiZXBoZW1lcmFsX3B1YmxpY19rZXkiOiJRaHQweGpvNU5OTlQtSkxhcGpuenlNbHdsc3RGckpzbVJFMkpVOV94SFJzPSJ9fSx7ImJsaW5kX3NoYXJlIjoiQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT0iLCJsb2NrIjp7ImNpcGhlcnRleHQiOiIwQmliSV9lSXFNWHlQTnZyb2F1QTlaNEkzeXdCeEVtcVBjMGxsQ01sbE5IWEg3Uk02Wk9XLWlKUWo4RlFiWHpydVJYQ1kyUF85U1BtWHlmNVdNSlJhRC03Z3RlMnFIN0giLCJlcGhlbWVyYWxfcHVibGljX2tleSI6InV6eEttWHZvblVGTGdpTm9QTW9Hd2l4TGNINXJZZEpON3djVmEyZl9VbW89In19LHsiYmxpbmRfc2hhcmUiOiJBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPSIsImxvY2siOnsiY2lwaGVydGV4dCI6Ik92MzExcDM3RWlUMGtPQTZ1RGgzdnBxZEpLYnBmUXlVYTNUNlpxQWdvc1EzLWFCSE53S2d0SnlWQURNQjhuYW5WdEJDUllEa1l3YXNhaURtWHk5SDlQZkx2UGdCZ0sxYyIsImVwaGVtZXJhbF9wdWJsaWNfa2V5IjoiTDBRTk8yS0VvNW1aZ0E1UHdzM2M5bDVBV2tjbERpd3VfRDFUNUFMc21HYz0ifX0seyJibGluZF9zaGFyZSI6IkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9IiwibG9jayI6eyJjaXBoZXJ0ZXh0IjoicU01RlNWbm92MVVRZUp0VXJCLTUwdG84ZnRVdDhHVGQ1dnNMS29VcmxNTFh4YkkwRTk0RjJpS1BiMWY5Y2p0MGluNy1PQklvNFYxNjNlTGdlTlgzcDBxSVo0MFBpQV8xIiwiZXBoZW1lcmFsX3B1YmxpY19rZXkiOiJIaVdqS2FaUFpIanFVUVF6MHNUblVpTEg1ek9xNWQwYjZqUzQ2cHJiNmhFPSJ9fSx7ImJsaW5kX3NoYXJlIjoiQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT0iLCJsb2NrIjp7ImNpcGhlcnRleHQiOiIxVWFPWHBmdG41YWhCbjRLMVVSYWd0U3VycTRKNmxhY2swZHVOd1NHbXhuTlVTc2ZlM1pFMmZ0eDdidTZ3RjQ5Wmx2V0dTRmR3eXpSdGVRSHcza1BhSk01clJUQU8xZnMiLCJlcGhlbWVyYWxfcHVibGljX2tleSI6IkFoUnB6Mk03YXhBN2VSV3pSbE96akstWVRxaFVsM2ZSeXItRjZTZGFNUTg9In19LHsiYmxpbmRfc2hhcmUiOiJBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPSIsImxvY2siOnsiY2lwaGVydGV4dCI6Ii1HMkRBRlF5bjhWZW9uSXJaZF8tdWpPTENnTE9FWGNOTEVCRV9WRzI5TFA5NkVXZTJUaGJWOENRdENFY1pEU0VWNEJVZGVQU2NCLVRmWGxHeW1mWTJiajdyVU81TTdjTCIsImVwaGVtZXJhbF9wdWJsaWNfa2V5IjoiNnFMcHo4bU9CUUtERldqeW1fQWVLeFAtTTI1RjlLMkpnQXRUWmRmSWxEWT0ifX1dfSwiYW5vbl94ZnJfcHJvb2YiOnsiY193aXRuZXNzX3BvbHlzIjpbeyJ2YWx1ZSI6Im5jR1Q4R3c5a1FENlYtMXNIUGxOQXNzZ1JSeERENm1yaFhSUktWcHRQU3Z2ZS12WkFpNkc1Uy1HcFhTRzJMRVIifSx7InZhbHVlIjoiVjlmUTdNSGozekNOSW9UMGlpVnF0Ymlud3V5QVVlcWV2U2I1YVVfcEdKdndITXVicjZlNDJzdHdSbXlXTllxWSJ9LHsidmFsdWUiOiJyZXc0cUVzWF9TYlNuV2xIVFZrd0JBOGlRVzVxSEg2MXZfbVctWndFR0FaUlVNR3pqd2diTzRnOGZ4YzZuZWNTIn0seyJ2YWx1ZSI6IjlFb19YSHZZQ1VDRVk3cU9OVVc1eDl6dkhtbWoxVHd4MUxpXzJTcVYtSTFSX2ducFlJTmxfbS10Z1p5V09xOE8ifSx7InZhbHVlIjoiWmcxVlJVQzhUR2VwZDhXQkxTaUkyWEVDMEVuYUZOcXJLYm52dlF5Y0xSbENZM3FoNTloSllqd3hYX2ZHWGhjQyJ9XSwiY19xX3BvbHlzIjpbeyJ2YWx1ZSI6IjlKNGVqME1HbmdWSV9MNUkxeGZaaWF3NE9jZmtoc0V2SF9CbVNPdzdtRERxaGozNlRGYUVOQ1EzOUpFcEw3c0EifSx7InZhbHVlIjoidG5uZVBmMDRMb0Rha3JsdTZ3aTVPa0M4bUpOd1R2aXZJaWhEdURmZkhpaEQyVVdGVEJFT1BVd2ZWdG85c2dVSiJ9LHsidmFsdWUiOiJ1Y2prSG1PdUd3TmREMFF0M2VtV1FpSHJaQzJpOTNBNnNUbE9CZ0Y1S20wR1ZtcHp1dXlLcXRpM1lEYjZCTXNJIn0seyJ2YWx1ZSI6Im0xQl94dUNxWVZKY1I3ZEtfWFJXNlVuRGpBam9OUmxRdEZNQ25iSjFlS1h3ckxrQld0M0hEZUFLWFUxbVk4NkYifSx7InZhbHVlIjoic2JFemhaRm9yYm1BWFJHd1dJbVR1cE5Fay0wR2VzaWwtLUh3OHc4S196aDBMbGNpVUEzUVQ3MVdXaXFkcEdZUSJ9XSwiY19zaWdtYSI6eyJ2YWx1ZSI6IkhtNnB3SllxdV8zMXJqRW4tWWZwRTRjSUw2b1lCWnRlRWdLWFlmcGVSWTBGcGFlYklrUENhd1QwaV9ySk9zRVIifSwid2l0bmVzc19wb2x5c19ldmFsX2JldGEiOlsiWEJkSkMzN25Bb2gxQ1VGamk1SV9LSDliREQwUlo4bXRReWJmRDRyQmlVcz0iLCJld0tYYjJReTZzWjlSSWVGcXpNWkJ5cXhWc2dfRVk1a29ZWElnblFLVVJjPSIsImRRdXVtY1pQbS1qdjdpMmtjU3d4WHlSWWMyY0d6ek1qSGF0cEdhaEdtbW89IiwiWlhLZWQ5SVh6aUNfZ0R6aGtfY2xlb0FaVDN6RVp2R2JzQmUwQ1lnOWFVVT0iLCJnYVdUdE5NN29MWFBBSmtmOUY1UWpyUy1URGhYZXh6UzFObjhycnk0ekZvPSJdLCJzaWdtYV9ldmFsX2dfYmV0YSI6IjRYWlVoOE1ueTlpNXZaSDR5YlU0YkJ0N3lLVmxLY0xqbFU5WmFZQlptMWs9IiwicGVybXNfZXZhbF9iZXRhIjpbIlpDa2R5bTR0NzhndWh3a0pCMEExTEdBUS1JNEplSktjcXN3eEpoVnJrMU09IiwibnZ5QnVfQ1lpUXZPOTFDQm9pODhJV3BtMTJrQkNXM0ZkU196a3BIZmtUVT0iLCJfdWhWZ3kzLWUteTIxRkE1cWJLcWwtV3ljQVh5ZnVQXzJ0QWp3eFV3eGo4PSIsIlB2U1pCYkw1TjNCbEtTdUlOVUV5ODNpVFBxazBHNlV2X0hhZlR5YUp3RFU9Il0sImxfZXZhbF9iZXRhIjoiOUZ2ZlN1dzVEM0daSmZERHFkZWtEQWhKcC1qbGV0TGpRM3RXMmpibVFBYz0iLCJiYXRjaF9ldmFsX3Byb29mIjp7ImNvbW1pdG1lbnQiOnsidmFsdWUiOiJub0tzZTd5OEZjRnJhVkhydndzZFhJTlNGN1NRS05yYVRPX1VibXRlbGJYdi1Jc2tIUkt3d2ZTdFk5MElUTEFTIn0sImV2YWxfcHJvb2YiOiJ0ckg0V2h4NzB4ZEh5cUhydDBnY0h1SkJQMlp0clpvcnhKZjRsUUYyRnZzQWNPNEdudVIxRUJRdGxGTndRVVlXIn19LCJub25fbWFsbGVhYmlsaXR5X3RhZyI6InU1NlhhMHNWdVEwQ0o1WXpNbTVYbVdfaGNub05fXzRnYVNXQlV3am1kMEE9In0sIm5vbmNlIjpbWzUzLDE0NCwyMTEsMTc4LDIzMCwxMTIsMjAxLDY5XSwyMl19fV19fQ=="
}
],
"total_count": "1"
}
}
```
NOTE: Tendermint saves the attributes key as base64 encoded, so the result JSON currently has it in base64 form. FS API can return it as the original string if it saved as such.
Here for example, "`G96MKTtr5pQ1ou6iRgvHPqLELtgrYHai89HAnvfubNdd`" and "`y`" are shown as "`Rzk2TUtUdHI1cFExb3U2aVJndkhQcUxFTHRncllIYWk4OUhBbnZmdWJOZGQ`=" and "`eQ==`" in the above response.
Also we need the API to query by multiple attributes of same event type
type = commitment.created
has_attribute = G96MKTtr5pQ1ou6iRgvHPqLELtgrYHai89HAnvfubNdd='y' or HwstxEfXihXb34UdQyChUgfstutaAei5dtqzvzJHgC6p='y'
A search API needs to support only one event-type at a time.
The API should support pagination.
The current event-types of interest are
- `addr.from`
- `addr.to`
- `nullifier.used`
- `commitment.created`