diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 6a3b476f92..e4b9b9573c 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -668,7 +668,60 @@ "required": true } ] - } + }, + "/v2/teal/compile": { + "post": { + "description": "Given TEAL source code in plain text, return base64 encoded program bytes and base32 SHA512_256 hash of program bytes (Address style).", + "consumes": [ + "text/plain" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "summary": "Compile TEAL source code to binary, produce its hash", + "operationId": "TealCompile", + "parameters": [ + { + "description": "TEAL source code to be compiled", + "name": "source", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/PostCompileResponse" + }, + "400": { + "description": "Bad Request - Teal Compile Error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "401": { + "description": "Invalid API Token", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "default": { + "description": "Unknown Error" + } + } + } + } }, "definitions": { "Account": { @@ -1359,6 +1412,26 @@ }, "x-go-package": "github.com/algorand/go-algorand/daemon/algod/api/spec/v1" } + }, + "PostCompileResponse": { + "description": "Teal compile Result", + "schema": { + "type": "object", + "required": [ + "hash", + "result" + ], + "properties": { + "hash": { + "description": "base32 SHA512_256 of program bytes (Address style)", + "type": "string" + }, + "result":{ + "description": "base64 encoded program bytes", + "type": "string" + } + } + } } }, "securityDefinitions": { diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index ea23518c12..767656e54d 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -382,6 +382,30 @@ }, "description": "A potentially truncated list of transactions currently in the node's transaction pool. You can compute whether or not the list is truncated if the number of elements in the **top-transactions** array is fewer than **total-transactions**." }, + "PostCompileResponse": { + "content": { + "application/json": { + "schema": { + "properties": { + "hash": { + "description": "base32 SHA512_256 of program bytes (Address style)", + "type": "string" + }, + "result": { + "description": "base64 encoded program bytes", + "type": "string" + } + }, + "required": [ + "hash", + "result" + ], + "type": "object" + } + } + }, + "description": "Teal compile Result" + }, "PostTransactionsResponse": { "content": { "application/json": { @@ -1536,6 +1560,85 @@ "summary": "Gets the node status after waiting for the given round." } }, + "/v2/teal/compile": { + "post": { + "description": "Given TEAL source code in plain text, return base64 encoded program bytes and base32 SHA512_256 hash of program bytes (Address style).", + "operationId": "TealCompile", + "requestBody": { + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "description": "TEAL source code to be compiled", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "hash": { + "description": "base32 SHA512_256 of program bytes (Address style)", + "type": "string" + }, + "result": { + "description": "base64 encoded program bytes", + "type": "string" + } + }, + "required": [ + "hash", + "result" + ], + "type": "object" + } + } + }, + "description": "Teal compile Result" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request - Teal Compile Error" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Invalid API Token" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Error" + }, + "default": { + "content": {}, + "description": "Unknown Error" + } + }, + "summary": "Compile TEAL source code to binary, produce its hash", + "x-codegen-request-body-name": "source" + } + }, "/v2/transactions": { "post": { "operationId": "RawTransaction", diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index 815aedb03c..82a4bd39b8 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -165,95 +165,96 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AA==", + "H4sIAAAAAAAC/9w8a3MbuZF/BcdLlR/HISVZdmJVuXKOtQ9dbK/LUnIP05cFZ5okVjPABMCI4vr036+6", + "AcwTQ8prJ3u5T7YGQKPRL/QL/DRJVVEqCdKaydmnSck1L8CCpr94mqpK2kRk+FcGJtWitELJyVkYY8Zq", + "IdeT6UTg15LbzWQ6kbyAZg6un040/LUSGrLJmdUVTCcm3UDBEbDdlTi7hnSbrFXiQbx0IC7OJ3d7BniW", + "aTBmiOUPMt8xIdO8yoBZzaXhKQ4ZthV2w+xGGOYXMyGZksDUitlNZzJbCcgzMwuH/GsFetc6pd98/Eh3", + "DYqJVjkM8XyliqWQELCCGqmaIcwqlsGKJm24ZbgD4homWsUMcJ1u2ErpA6g6JNr4gqyKydmHiQGZgSZu", + "pSBu6L8rDfAzJJbrNdjJx2nscCsLOrGiiBztwlNfg6lyaxjNpTOuxQ1Ihqtm7E1lLFsC45K9//YVe/Lk", + "yXM8SMGthcwL2eipmt3bZ3LLJ2eTjFsIw0NZ4/laaS6zpJ7//ttXtP+lP+B9Z3FjIK4sL3GEXZyPHSAs", + "jIiQkBbWxIeO9OOKiFI0n5ewUhruyRM3+asypb3/r8qVtNIaZLpL1ho4CcqGyyFJ3ntSmI2q8oxt+A2d", + "mxdk5fxahmud1bjheYUkEqlWL/O1Mox7Cmaw4lVuWdiYVTJHDUVontFMGFZqdSMyyKZoeLYbkW5Yyo0D", + "QfPYVuQ5kr8ykI2ROX66PXJ01yYJ4vWL6EEH+r9LjOZcBygBt6QISZorA4lVByxzMLZcZqxtSxszbT7P", + "TrOrDTDaHAfcPUO0kyjQeb5jlviaMW4YZ8EqT5lYsZ2q2JaYk4trWu9Pg1QrGBKNmNO5QvDuHSPfgBgR", + "4i2VyoFLIl5QuiHJ5EqsKw2GbTdgN97cazClkgaYWv4EqUW2/9vlD2+Z0uwNGMPX8I6n1wxkqrJxHvtN", + "Y5fXT0YhwwuzLnl6Hb+pclGICMpv+K0oqoLJqliCRn4F02gV02ArLccQchAPyFnBb4ebXulKpsTcZtuO", + "j4KiJEyZ892MXaxYwW9fHE09OobxPGclyEzINbO3ctQ/wb0Po5doVcnsHte3RYa1LgxTQipWAjJWQ9mD", + "id/mED5Cfh4+jVPRQicAGUWn3uUAOhJuIzKDqosjrORraInMjP3JWy4ateoaZG3g2HJHQ6WGG6EqUy8a", + "wZG23u9ZSmUhKTWsRETGLj050Hq4Od68Fv5uT5W0XEjI0PIS0sqCs0SjOLU23O/HD+/nJTfw7HTs9m5G", + "78n9lepzfS/H78VtmpQ4lYzcizjqFTYe9XTW3yPuae9txDpxnweMFOsrvEpWIqdr5ifkXyBDZcgIdAgR", + "Lh4j1pLbSsPZQj7Gv1jCLi2XGdcZfincpzdVbsWlWOOn3H16rdYivRTrEWLWuEYDCVpWuH8QXtwc29uo", + "v/xaqeuqbB8o7QRkyx27OB9jsoP5uYL5so7i2g711W1wsj93hb2tGTmC5CjtSo4Tr2GnAbHl6Yr+uV2R", + "PPGV/jlGTJRcf8NSIOwD5Pf+G35CXQdJpoyXZS5SjtSc07159qmFyW80rCZnk3+eN9mBuRs1cw/X7dhl", + "20MoSrt7hMf/Q67S61+0d6lVCdoKd4olwhkKCIFnG+AZaJZxy2dNFOHcixE208LvaR0FB6Ajlv0H+g/P", + "GQ6j8HEbvBb02IRB30W1UgsZOjrOfLqdcAI5YIoVzrdh6JN8Fpavms2dXaoNyQdPlo99aBGefOPcKUYr", + "wiHw6G9VBpeW28r8IjZ1d2mAhQvFEDWEdGdCpeVLVVnGmVQZMEOTJ9Meu1Nu001VjoStr9zolSgQMpNc", + "KgOpkplp6Fpb0+kk58aOuRGvubHOlAuZEY0dwrjG3SHMAMhxuDegjVAyDvnPbjAGO0VKS1MZ5iEwU5Wl", + "0hayQSDsXY/xvd7Cbb2XWrVgl1pZlaocBbAycAjyGJVa8D2x3Ekcgbj1vkTt6wwPR2EbStIuSsoOEg0h", + "9iFyGWa1qNsOM0YQQYWsV5ITJgyJYoNXHdtMJ8aqsoQs4TapZL1ujEyXbvZL+6dm7lC4MBgk/yoDlinA", + "3W3AyWO+dZR1AeaGG+bxYAW/xhu+1Grt75whzqgziREyhWSf5KP2XOKstgoc0KWe9eloaUfPesrRk9+o", + "0I0KwQEujB34PkaxdVG9cxHUVeNdfAVzeA6Wi9zUJq8O05pdKKLrJ5q33FCML22+QxleCV24pAhdMyZ8", + "cwY187u48L9RS5kxDVuuszBjNrCzPvciM7iNBzYu6UITmIgjuqp3E5alIU3h8zqzqLq7zIJDzsRyTjSA", + "8liIVCvuUklIeHRoFaHhsiUaCo7YUVLD1xnG9xRynbjMVeRSceMhsxUiijar4nADe0YVrebIdgMULKP1", + "7BGxzeQVRmgGxg5SKpUnoLXSsbhoYGf6O12L9BoyhgJJJQ5v/h50ccJN2ENkqqkjx+1m58BueFmChOzR", + "jLGXkpES+TRw76rrbS4f2H3739KuWUVJLC4ZHXK2kLFrK6TAvlCKApj9suPKIV+4lQOyfyN7K0cEiG8p", + "gkNwUYnc60de0sqWbRuY8pZQOSzuYz6/oxoB73BZZJTlbMyXqZaFoEJBa9oUbUVIYA2dQ2FnjF2RtnCN", + "lLsBjW44N+6S9+nmQqw3eHWmKUB2tpBJB5NUFX7jh81/nSIuqqOjJ8COHvXXGIt+is+AOB3or33BjqZu", + "iMjFXrDFZDEZQNJQqBvI2EqrgrXl2q06CPafargL+cPAFLGC71wuPugiM9VqJVLhiJ4rtGRr1XM3pKIR", + "0IgeFEvQhgk7JeNNFCU3zfGlUcD49fg1woUIVHTQ8PLQmu9C2qIrO4bBLU/xlJyMzI5tUVBqORveclaV", + "SRtApDC3d0cfLrnknIXCtJIJn6t3tVrRfvS3sjw/gN8VzhlLD7fEdXbYaRsQI4rBfdT/JSsVcl34AkXI", + "YufC2AGSriZjKVauBTJy6czYf6qKpZz0t6ws1E690uQpUwSFO9AtGvb0vklDIcihAGlr6jx+3D/448ee", + "58KwFWxDVQ8n9snx+LFTAmXsK1WUIoevkNLYcLMZcnrJDTw5YZffv3x6fPKXk6fP8DDk7/OCLXd4sT70", + "GSdm7C6HR/Hb0VS5jUN/dhpqK124k1hiri05hHAN+z4ScgVotR3FmKskBjp+sSXpqfjtRcT1onOiVxJp", + "5sDTzA6emeDe66gt0BfnYUMySsbQVX03nWDMmu++guF0gJgG7yk6b8vrGAWTOdmyViXW64HZGQvFMOHi", + "lv5lxId9H0KtgceiZC4kJIWSsIv23QgJb2gw6u+Qqo0sJqM3trYfinbw76HV3ec+3PxS+hK3WyLxrq4L", + "fwXm9+H2cm3tGjR565CXjLM0R9+AMiJWV6ldSE6Zhp472ROLkD8Zzz29ClPiya5ILsqDWkhukIZ1/mEW", + "s2QriCQAvwUIKShTrddgeu4lWwEspJ8lJKuksLQXeeeJY1gJmgzfzM1Ej2rFc0qV/QxasWVlu1cYlcqc", + "h+jaIHAbplYLyS3LgRvL3gh5dUvgQvwYZEaC3Sp9XVMh7v+vQYIRJonfDd+50e+52YTj48RgbPxil+JF", + "+E09bWcBecutBY2Q/vvh788+vEz+iyc/HyXP/2X+8dPp3aPHg48ndy9e/E/305O7F49+/5sYpwLusUKO", + "x/zi3Lt3F+d0hzfVxgHuA/B/qyxuIWQSFTIMuwohqR+gJ1vsIXoiQYAesWCJAtcX0t5KFKQbnouM218m", + "Dn0TN9BFpx09qekwopeUC2f9GAsb1yopeXrN1/h9LeymWs5SVcyDWztfq9rFnWccCiVpLJvzUsxNCen8", + "5vjA1fgF9opFzBWVSl09qlXqirj3vkm1E2kiRNfl5mrFGGmdw0pIgeNnC5lxy+dLbkRq5pUB/Qeec5nC", + "bK3YGfMgz7nllKDo5dXGGlGpkcljU1bLXKTsun2/NfI+lqdaLD4g1ReLj8z2ooLhbeS3igq+2yDZCrtR", + "lU18bnI8ydEkggiyS5Pt23XKPGzHZp/79PDj9o9yhiZ+aBzCU7s5KCZNAj8kVZCHb5X1aVC+DT1GlQHD", + "fix4+UFI+5ElPgFAfZLfqxwR+9HrKBrWXQmdWG9vHbQFIxbe+Yxosu9oJdd4spYmqFU4Z8iojh31rD5r", + "kKt9h/2iU8aOV3JtRSpKbr13cI+a8bvOGgRySPai0oaBUVeonAC2iBQVMjc5wVgoyg7AEeRHZVzDHZ4x", + "XLJhJxedcpfCp/Zy78Itc2jloo0vjXFNhi4c2/XLjqEWlxLQslH6gEaXIm3rsvE1BHHTVA6odnQfPTyY", + "ykYpCkU/0U3hCdw3hxs+mk0dbW65aFXyWj2TdesKwiam9JRhWrcxuc790OIS+lpCM8tk+lmNKdOJL0/H", + "2KFkjuzIIIc198lDKnx7QfGoPTAtBiEeP6xWGJqwJFYU5MaoVLgKSrizTNgD8I56zJgLqti9IcTEuIU2", + "ZV0IMHur2rop15+DpARBaRoeYFO+pvU3HI62mycU/vY7eEsNbUejRNOmz8uxcRj5TSdRkzTmQHRmMTdl", + "CQM3JiaiaJqGsdAw4jKQA3k3SceyJtexCHmx+GCAxPAyLGt5FeyhWDEud49ayTcNa/S7G18VtTUEX3/f", + "eOFGWUhWQhubkJscPR5O+tbQvf8tTo2bnw6pmGtEF1nc+tC217BLMpFXcW77ff94jtu+rd0rUy2vYUeX", + "DPB0w5bcphR8dbfHOXu2doXxvQd+7Q78mn+1895PlnAqbqwVRjedPf5BpKpnT/YpU0QAY8Ix5NooSaPm", + "hfymPe24S+VfelVS/LUCJjKQFoe0r8p0LAtSN5TWB6ZjpIzvAftKfg0+Xlum+OxezqAL5QYkd0jUkEZp", + "EjzmSM9EsKrhoLWrjx9a3u9nBGvtHQex2p5AC7Whia9cGmnjW6IjD7OGFaBKSOs6mQ+/Cgt388YhOrJH", + "9JUXBQmxhoBQKqDLO4QS7l6i9oy6jbH92DD0KQxEr1lIFZoluOYPV0DkuVERMJXcculeruA6R0O/2oC7", + "GHHVVqF5T7mBaPpHmGSl1c8QN9crZFSkUORJSSUeWj2LtEz1nZDa9Wie4wX6tvEYFe13tRJF+OwzIN1g", + "ekTDScpb8SFVvoMXx6UTa/fKppMXiStHO5c5d/Ab5fA4D/K/Od8ueazzdrH4kCJOQcAQo7a/aRULiwMX", + "TN3w4WWPXaxc88i0mStcP1wJuqnmDoRhVNyvWuL3Dy/yGaSi4Hk8/MiI+ledmmcm1sI9VaoMtN7CeECs", + "VEJaJ0X+PZF7LtCQ5mLFjqat13aeG5m4EUYsc6AZx24GRsl0tjriCUvweCDtxtD0k3tM31Qy05DZjXGE", + "NYphXH1VPyqsA7wl2C2AZEc07/g5e0ihrRE38AipWLgXXJOz4+eU73R/HMUuO/8mcZ9dyciw/Ls3LHE5", + "ptjewcBLykOdRXsz3RvqcRO2R5vc0vvoEs30Vu+wLhVc8nXshcti8aE4gJNbS9wkz7hHF5m5V5DGarVj", + "wsb3B8vRPo3UPND8OTR8Q0+BCmQVM6pAeWoeurhNAzj3pNJ34Qe8wiDlEcrQmNWqvf39oyB3l8dOTdme", + "t7yALlmnGMpTBVI0z8i8QZyN9AKAvolvokcYHO5Nv5Y9lEomBepO9qipprXkL7YxZaqi29pgu/oZ7P2g", + "7+tqIZRklLBVh7C8ZZN+MYkrHT8nr3CrP71/7S+GQunYW4jGGvpLQoPVAm6iGtuvCtWeSX1dBMrHHJRv", + "tFa6XYMe9EG59rP6kS69d1bhIQwpT/0osOsr4FjkZSJqOL18ib9abJ8lTIwh/ufRtw8u3c8t2wLjUirL", + "LQRmMs4KlUHOjG+Fy2HN050vLpmFRIJnQgP1k4mCevA5M1u+XoOmqqQm/yEUtwna8OzLSuTZobDJw/gD", + "zY0Ue3/Ncu0wO+OQdYFlr+etpeKdakD/cRIddH95st7mb1WSxEvDFRk65I8W5kJxlkAwQr95N9JobYT9", + "mst0E6UQQWm9Io00kG+4lJBHV7sr71eSkIL/pEZwLoSMD/VFwBGmR4bmzN0Thi0D/EinznRiIK20sLtL", + "1CofwZfiL9Gc1ne1/vongrVz731L9yjbW91G25t3tN8p18FWoDNDaXdLTYrf3PKizME7py8eLH8LT353", + "mh09Of7t8ndHT49SOH36/OiIPz/lx8+fHMPJ756eHsHx6tnz5Ul2cnqyPD05ffb0efrk9Hh5+uz5bx+E", + "R6wO0eaB6H9Qt0ry8t1FcoXINozipfgj7FzBHaUzdBTxlJIZUHCRT87Cp38NeoIK1PrJGf914i+xycba", + "0pzN59vtdtZeMl/TQ5HEqirdzMM+w57QdxcMZOYiDYplSZdQWUh3XGZU2JwSGDT2/pvLK/by3cWsMQeT", + "s8nR7Gh2TA1mJUheisnZ5Al9IqnfEN/nG+C5Rc24m07mBV6aqfF/eRM+881U+OnmZB6qcvNPPmK72zfW", + "DZl9oaFZQL0qZv6JMp0tQDlka9Bz1yXWfA5J0mHmsIvOpFTGjssye0jXs4TtI//Ex4GNZKGZalptHTN8", + "w0Nw8/yuSPmaQxcZPWhwQDsFjz/CzoTMnv9tsA+xAPzH5ve+fqRgtMy4hSlTmv3I87z1jX67ItB9NvLj", + "YXVN6L6/HHZ3N42htQIIoTGFwL5hHDX9GkIO29Gg0/c1Y+cupDP1S46652wFo7+i4lpz2j18BGRydnx0", + "dBRr9unj7EyLx5hSEVuV5HAD+ZDVY0j0Utn7fnMgRrI8XoFom8qI1IWf6KmLEqM/wdBNq38OdudKPrBs", + "y4V/qdXqz7LKR4rh10ncewYfzpBXO/6LFgmC3P+DNx97D+xPjo7+nzcuo6PH14beCWlxwy1MPt55q2Y2", + "lc3UVo4bLqp18NwnCyh8r28IjOM9gNpSzVh4d5/vwu+lME4/RYbBUudnjEJ1uvfOxf9Y1RLWQtIGpOW0", + "i8uK8VbM6Z+7Do3gpcfsrXsd3LN70V9zcDjG9T6m9F8qS/d/4bqXh6HLofP3HFUBw+uELrqEKDe87Szw", + "fO57/Ftfu89ZIl/nda0pOti/bGOj80/2VjhcWo4hcad2CT98RCJTFsMzrvFzzubzXKU83yhj5xM0Ml0f", + "qD34sabfp8DtQMe7j3f/GwAA///T4W65QFMAAA==", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index 010e664c67..876d512d17 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -315,6 +315,16 @@ type PendingTransactionsResponse struct { TotalTransactions uint64 `json:"total-transactions"` } +// PostCompileResponse defines model for PostCompileResponse. +type PostCompileResponse struct { + + // base32 SHA512_256 of program bytes (Address style) + Hash string `json:"hash"` + + // base64 encoded program bytes + Result string `json:"result"` +} + // PostTransactionsResponse defines model for PostTransactionsResponse. type PostTransactionsResponse struct { diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 7f0e1f96ff..ff42743ae4 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -35,6 +35,9 @@ type ServerInterface interface { // Gets the node status after waiting for the given round. // (GET /v2/status/wait-for-block-after/{round}) WaitForBlock(ctx echo.Context, round uint64) error + // Compile TEAL source code to binary, produce its hash + // (POST /v2/teal/compile) + TealCompile(ctx echo.Context) error // Broadcasts a raw transaction to the network. // (POST /v2/transactions) RawTransaction(ctx echo.Context) error @@ -247,6 +250,27 @@ func (w *ServerInterfaceWrapper) WaitForBlock(ctx echo.Context) error { return err } +// TealCompile converts echo context to params. +func (w *ServerInterfaceWrapper) TealCompile(ctx echo.Context) error { + + validQueryParams := map[string]bool{} + + // Check for unknown query parameters. + for name, _ := range ctx.QueryParams() { + if _, ok := validQueryParams[name]; !ok { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unknown parameter detected: %s", name)) + } + } + + var err error + + ctx.Set("api_key.Scopes", []string{""}) + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.TealCompile(ctx) + return err +} + // RawTransaction converts echo context to params. func (w *ServerInterfaceWrapper) RawTransaction(ctx echo.Context) error { @@ -400,6 +424,7 @@ func RegisterHandlers(router interface { router.GET("/v2/ledger/supply", wrapper.GetSupply, m...) router.GET("/v2/status", wrapper.GetStatus, m...) router.GET("/v2/status/wait-for-block-after/:round", wrapper.WaitForBlock, m...) + router.POST("/v2/teal/compile", wrapper.TealCompile, m...) router.POST("/v2/transactions", wrapper.RawTransaction, m...) router.GET("/v2/transactions/params", wrapper.TransactionParams, m...) router.GET("/v2/transactions/pending", wrapper.GetPendingTransactions, m...) @@ -410,105 +435,108 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index 1b28090266..8aa80db880 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -315,6 +315,16 @@ type PendingTransactionsResponse struct { TotalTransactions uint64 `json:"total-transactions"` } +// PostCompileResponse defines model for PostCompileResponse. +type PostCompileResponse struct { + + // base32 SHA512_256 of program bytes (Address style) + Hash string `json:"hash"` + + // base64 encoded program bytes + Result string `json:"result"` +} + // PostTransactionsResponse defines model for PostTransactionsResponse. type PostTransactionsResponse struct { diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index fbbbfdc450..248b6780d4 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -17,7 +17,9 @@ package v2 import ( + "bytes" "errors" + "encoding/base64" "fmt" "io" "net/http" @@ -32,12 +34,15 @@ import ( "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/node" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/rpcs" ) +const maxTealSourceBytes = 1e5 + // Handlers is an implementation to the V2 route handler interface defined by the generated code. type Handlers struct { Node *node.AlgorandFullNode @@ -465,3 +470,24 @@ func (v2 *Handlers) GetPendingTransactions(ctx echo.Context, params generated.Ge func (v2 *Handlers) GetPendingTransactionsByAddress(ctx echo.Context, addr string, params generated.GetPendingTransactionsByAddressParams) error { return v2.getPendingTransactions(ctx, params.Max, params.Format, &addr) } + +// TealCompile compiles TEAL code to binary, return both binary and hash +// (POST /v2/teal/compile) +func (v2 *Handlers) TealCompile(ctx echo.Context) error { + buf := new(bytes.Buffer) + ctx.Request().Body = http.MaxBytesReader(nil, ctx.Request().Body, maxTealSourceBytes) + buf.ReadFrom(ctx.Request().Body) + source := buf.String() + program, err := logic.AssembleString(source) + if err != nil { + return badRequest(ctx, err, err.Error(), v2.Log) + } + + pd := logic.HashProgram(program) + addr := basics.Address(pd) + response := generated.PostCompileResponse { + Hash: addr.String(), + Result: base64.StdEncoding.EncodeToString(program), + } + return ctx.JSON(http.StatusOK, response) +} diff --git a/go.mod b/go.mod index cef665d9c7..84b6f16085 100644 --- a/go.mod +++ b/go.mod @@ -43,13 +43,15 @@ require ( github.com/spf13/cobra v0.0.3 github.com/spf13/pflag v1.0.3 // indirect github.com/stretchr/testify v1.5.1 - golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 - golang.org/x/net v0.0.0-20200506145744-7e3656a0809f - golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 - golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8 // indirect + golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 + golang.org/x/mod v0.3.0 // indirect + golang.org/x/net v0.0.0-20200513185701-a91f0712d120 + golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 + golang.org/x/tools v0.0.0-20200518195306-39aadb5b76f2 // indirect google.golang.org/appengine v1.6.1 // indirect gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009 gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2 // indirect + gopkg.in/yaml.v2 v2.3.0 // indirect ) diff --git a/go.sum b/go.sum index d3192bf63d..3dd5dbc464 100644 --- a/go.sum +++ b/go.sum @@ -27,9 +27,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gen2brain/beeep v0.0.0-20180718162406-4e430518395f h1:eyHMPp7tXlBMF8PZHdsL89G0ehuRNflu7zKUeoQjcJ0= github.com/gen2brain/beeep v0.0.0-20180718162406-4e430518395f/go.mod h1:GprdPCZglWh5OMcIDpeKBxuUJI+fEDOTVUfxZeda4zo= @@ -40,34 +38,26 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-chi/chi v4.1.1+incompatible h1:MmTgB0R8Bt/jccxp+t6S/1VGIKdJw5J74CK/c9tTfA4= github.com/go-chi/chi v4.1.1+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= -github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f h1:zlOR3rOlPAVvtfuxGKoghCmop5B0TRyu/ZieziZuGiM= github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/gofrs/flock v0.7.0 h1:pGFUjl501gafK9HBt1VGL1KCOd/YhIooID+xgyJCf3g= github.com/gofrs/flock v0.7.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherwasm v1.0.1 h1:Gmj9RMDjh+P9EFzzQltoCtjAxR5mUkaJqaNPfeaNe2I= github.com/gopherjs/gopherwasm v1.0.1/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/schema v1.0.2 h1:sAgNfOcNYvdDSrzGHVy9nzCQahG+qmsg+nE8dK85QRA= github.com/gorilla/schema v1.0.2/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -75,16 +65,13 @@ github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2 h1:BkkpZxPVs3gIf+3Tejt8lWzuo2P29N1ChGUMEpuSJ8U= github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2/go.mod h1:YvbcH+3Wo6XPs9nkgTY3u19KXLauXW+J5nB7hEHuX0A= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/labstack/echo/v4 v4.1.16 h1:8swiwjE5Jkai3RPfZoahp8kjVCRNq+y7Q0hPji2Kz0o= github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -102,14 +89,11 @@ github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK86 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/olivere/elastic v6.2.14+incompatible h1:k+KadwNP/dkXE0/eu+T6otk1+5fe0tEpPyQJ4XVm5i8= github.com/olivere/elastic v6.2.14+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= @@ -147,9 +131,13 @@ golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88= golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -162,9 +150,10 @@ golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbP golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120 h1:EZ3cVSzKOlJxAd8e8YAJ7no8nNypTxexh/YE/xW3ZEY= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -181,6 +170,8 @@ golang.org/x/sys v0.0.0-20200430082407-1f5687305801 h1:Jp2/1+ZY++XrlALjnberpN8Qk golang.org/x/sys v0.0.0-20200430082407-1f5687305801/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -193,28 +184,25 @@ golang.org/x/tools v0.0.0-20200423205358-59e73619c742 h1:9OGWpORUXvk8AsaBJlpzzDx golang.org/x/tools v0.0.0-20200423205358-59e73619c742/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8 h1:BMFHd4OFnFtWX46Xj4DN6vvT1btiBxyq+s0orYBqcQY= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200518195306-39aadb5b76f2 h1:x5byaLtwftlfxkjQwPYSwshF9F3HE8iVApWvVu60NtY= +golang.org/x/tools v0.0.0-20200518195306-39aadb5b76f2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009 h1:q/fZgS8MMadqFFGa8WL4Oyz+TmjiZfi8UrzWhTl8d5w= gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009/go.mod h1:O0bY1e/dSoxMYZYTHP0SWKxG5EWLEvKR9/cOjWPPMKU= -gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2 h1:MZF6J7CV6s/h0HBkfqebrYfKCVEo5iN+wzE4QhV3Evo= gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2/go.mod h1:s1Sn2yZos05Qfs7NKt867Xe18emOmtsO3eAKbDaon0o= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=