curl --request GET \
--url https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions \
--header 'X-Access-Key: <api-key>'import requests
url = "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions"
headers = {"X-Access-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Key': '<api-key>'}};
fetch('https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions")
.header("X-Access-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"id": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25",
"projectId": "dfdc391a-a15d-4590-9aef-8691259c7df4",
"name": "periodic-cron",
"description": "every 1 hour",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "65f4e0e8-4b67-4f0c-815f-1a08cd418f1a",
"index": 1,
"actionId": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25",
"parentActionId": "",
"runtime": "V2",
"function": "implementation:actionFn",
"triggerType": "PERIODIC",
"trigger": {
"type": "periodic",
"periodic": {
"cron": "0 * * * *",
"interval": "1h"
}
},
"commitish": null,
"source": "// Do not change function name.\nconst actionFn = async (context, periodicEvent) => {\n console.log(periodicEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }",
"createdAt": "2023-12-14T16:20:36.078679Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": true,
"createdAt": "2023-12-14T16:20:36.078679Z",
"deliveryChannels": null
},
{
"id": "74e9f7d8-4a53-425c-912b-8d5cef87cef1",
"projectId": "dfdc391a-a15d-4590-9aef-8691259c7df4",
"name": "mainnet-block",
"description": "Trigger on every 1000th block",
"status": "DEPLOYED",
"stopped": true,
"version": {
"id": "ac015512-fcca-4a94-b782-e1fb584d8aef",
"index": 1,
"actionId": "74e9f7d8-4a53-425c-912b-8d5cef87cef1",
"parentActionId": "",
"runtime": "V2",
"function": "implementation:actionFn",
"triggerType": "BLOCK",
"trigger": {
"type": "block",
"block": {
"network": [
"1"
],
"blocks": 1000
}
},
"commitish": null,
"source": "// Do not change function name.\nconst actionFn = async (context, blockEvent) => {\n console.log(blockEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }",
"createdAt": "2023-12-13T00:37:13.821647Z",
"deployRequested": false,
"deployError": null,
"invocationType": "ASYNC"
},
"editable": true,
"createdAt": "2023-12-13T00:37:13.821647Z",
"deliveryChannels": null
},
{
"id": "be048c73-41c3-4fcd-b0c6-d286af7155fe",
"projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582",
"name": "instadapp-implementation",
"description": "Track these 3 proposal events: add, remove & setDefault.",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "34655755-771f-4da7-989e-ec2b27e8f13b",
"index": 3,
"actionId": "be048c73-41c3-4fcd-b0c6-d286af7155fe",
"parentActionId": "",
"runtime": "V1",
"function": "instadappImplementation:implementationFn",
"triggerType": "TRANSACTION",
"trigger": {
"type": "transaction",
"transaction": {
"status": [
"MINED"
],
"filter": {
"any": [
{
"network": [
"1"
],
"status": [],
"value": [],
"gasLimit": [],
"gasUsed": [],
"fee": [],
"from": [],
"to": [],
"function": [],
"eventEmitted": [
{
"contract": {
"address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d",
"invocationType": "ANY"
},
"id": null,
"name": "LogSetDefaultImplementation"
},
{
"contract": {
"address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d",
"invocationType": "ANY"
},
"id": null,
"name": "LogAddImplementation"
},
{
"contract": {
"address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d",
"invocationType": "ANY"
},
"id": null,
"name": "LogRemoveImplementation"
}
],
"logEmmitted": []
}
],
"and": null
}
}
},
"commitish": null,
"source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet: 0x3bdf5a48174f7f8f7bfb2f43dbe399c47405bba1cea3480aa0c199270f262f7e\nexport const implementationFn: ActionFn = async (context: Context, event: Event) => {\n let txEvent = event as TransactionEvent;\n console.log('InstaDapp Implementation Event is detected');\n // Shorten logs because it's too large to print\n console.log({ ...txEvent, logs: txEvent.logs.splice(0, 5) });\n};\n",
"createdAt": "2022-10-18T12:37:10.392964Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": false,
"createdAt": "2022-10-18T12:24:51.187849Z",
"deliveryChannels": null
},
{
"id": "785e140d-3a15-45c0-90a7-8c54bb41e562",
"projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582",
"name": "instadapp-governance-event",
"description": "Track these 3 events: executed, queued & cancelled.",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "9d8eaac3-85cc-4c48-a557-47c36b80dd52",
"index": 3,
"actionId": "785e140d-3a15-45c0-90a7-8c54bb41e562",
"parentActionId": "",
"runtime": "V1",
"function": "instadappGovernance:governanceFn",
"triggerType": "TRANSACTION",
"trigger": {
"type": "transaction",
"transaction": {
"status": [
"MINED"
],
"filter": {
"any": [
{
"network": [
"1"
],
"status": [],
"value": [],
"gasLimit": [],
"gasUsed": [],
"fee": [],
"from": [],
"to": [],
"function": [],
"eventEmitted": [
{
"contract": {
"address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b",
"invocationType": "ANY"
},
"id": null,
"name": "ProposalCanceled"
},
{
"contract": {
"address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b",
"invocationType": "ANY"
},
"id": null,
"name": "ProposalQueued"
},
{
"contract": {
"address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b",
"invocationType": "ANY"
},
"id": null,
"name": "ProposalExecuted"
}
],
"logEmmitted": []
}
],
"and": null
}
}
},
"commitish": null,
"source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet: 0x338fda662797c4750d6c81bc261380ca4782cf8112227f53962f4fb60d13bbcb\nexport const governanceFn: ActionFn = async (context: Context, event: Event) => {\n let txEvent = event as TransactionEvent;\n console.log('InstaDapp Governance Event is detected');\n // Shorten logs because it's too large to print\n console.log({ ...txEvent, logs: txEvent.logs.splice(0, 2) });\n};\n",
"createdAt": "2022-10-18T12:37:10.370654Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": false,
"createdAt": "2022-10-18T12:24:51.154171Z",
"deliveryChannels": null
},
{
"id": "02a83586-aabb-45c6-9ea5-23e089879b22",
"projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582",
"name": "blacklisted-addresses",
"description": "This Web3 Action detects transactions that involve blacklisted addresses.",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "900f7a5f-cb71-4f46-9e82-51fded6d8691",
"index": 3,
"actionId": "02a83586-aabb-45c6-9ea5-23e089879b22",
"parentActionId": "",
"runtime": "V1",
"function": "blacklistedAddresses:blacklistedAddressFn",
"triggerType": "TRANSACTION",
"trigger": {
"type": "transaction",
"transaction": {
"status": [
"MINED"
],
"filter": {
"any": [
{
"network": [
"1"
],
"status": [],
"value": [],
"gasLimit": [],
"gasUsed": [],
"fee": [],
"from": [
{
"exact": "0xf38b4de019aca232711d7b7abae59adc93efc3e9"
},
{
"exact": "0x6B175474E89094C44Da98b954EedeAC495271d0F"
},
{
"exact": "0xa40dfee99e1c85dc97fdc594b16a460717838703"
}
],
"to": [],
"function": [],
"eventEmitted": [],
"logEmmitted": []
}
],
"and": null
}
}
},
"commitish": null,
"source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet with write storage type: 0x7295b1bdfc6b277c10a4b8b6002183c005f4512a4d1537a0a81b0ff3eb6fe6c9\nexport const blacklistedAddressFn: ActionFn = async (context: Context, event: Event) => {\n const blacklistedAddresses = [\n '0xf38b4de019aca232711d7b7abae59adc93efc3e9',\n '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n '0xa40dfee99e1c85dc97fdc594b16a460717838703',\n ];\n let txEvent = event as TransactionEvent;\n console.log('Blacklisted Addresses:', blacklistedAddresses);\n console.log(`Blacklisted Address: ${txEvent.from}`);\n console.log(`Tx Hash: ${txEvent.hash}`);\n console.log('Contains:', blacklistedAddresses.includes(txEvent.from));\n await context.storage.putStr(`Blacklisted Address: ${txEvent.from}`, txEvent.hash);\n};\n",
"createdAt": "2022-10-18T12:37:10.333383Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": false,
"createdAt": "2022-10-18T12:24:51.082156Z",
"deliveryChannels": null
}
]{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "bad_request",
"message": "Bad request input parameters"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "unauthorized",
"message": "Unauthorized"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "insufficient_permissions",
"message": "Insufficient permissions"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "resource_not_found",
"message": "The resource you requested could not be found."
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "internal_server_error",
"message": "Internal server error"
}
}Get details for all Web3 Actions
Retrieve the configuration details for all Web3 Actions created in a specific project.
curl --request GET \
--url https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions \
--header 'X-Access-Key: <api-key>'import requests
url = "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions"
headers = {"X-Access-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Key': '<api-key>'}};
fetch('https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions")
.header("X-Access-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}/actions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"id": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25",
"projectId": "dfdc391a-a15d-4590-9aef-8691259c7df4",
"name": "periodic-cron",
"description": "every 1 hour",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "65f4e0e8-4b67-4f0c-815f-1a08cd418f1a",
"index": 1,
"actionId": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25",
"parentActionId": "",
"runtime": "V2",
"function": "implementation:actionFn",
"triggerType": "PERIODIC",
"trigger": {
"type": "periodic",
"periodic": {
"cron": "0 * * * *",
"interval": "1h"
}
},
"commitish": null,
"source": "// Do not change function name.\nconst actionFn = async (context, periodicEvent) => {\n console.log(periodicEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }",
"createdAt": "2023-12-14T16:20:36.078679Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": true,
"createdAt": "2023-12-14T16:20:36.078679Z",
"deliveryChannels": null
},
{
"id": "74e9f7d8-4a53-425c-912b-8d5cef87cef1",
"projectId": "dfdc391a-a15d-4590-9aef-8691259c7df4",
"name": "mainnet-block",
"description": "Trigger on every 1000th block",
"status": "DEPLOYED",
"stopped": true,
"version": {
"id": "ac015512-fcca-4a94-b782-e1fb584d8aef",
"index": 1,
"actionId": "74e9f7d8-4a53-425c-912b-8d5cef87cef1",
"parentActionId": "",
"runtime": "V2",
"function": "implementation:actionFn",
"triggerType": "BLOCK",
"trigger": {
"type": "block",
"block": {
"network": [
"1"
],
"blocks": 1000
}
},
"commitish": null,
"source": "// Do not change function name.\nconst actionFn = async (context, blockEvent) => {\n console.log(blockEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }",
"createdAt": "2023-12-13T00:37:13.821647Z",
"deployRequested": false,
"deployError": null,
"invocationType": "ASYNC"
},
"editable": true,
"createdAt": "2023-12-13T00:37:13.821647Z",
"deliveryChannels": null
},
{
"id": "be048c73-41c3-4fcd-b0c6-d286af7155fe",
"projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582",
"name": "instadapp-implementation",
"description": "Track these 3 proposal events: add, remove & setDefault.",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "34655755-771f-4da7-989e-ec2b27e8f13b",
"index": 3,
"actionId": "be048c73-41c3-4fcd-b0c6-d286af7155fe",
"parentActionId": "",
"runtime": "V1",
"function": "instadappImplementation:implementationFn",
"triggerType": "TRANSACTION",
"trigger": {
"type": "transaction",
"transaction": {
"status": [
"MINED"
],
"filter": {
"any": [
{
"network": [
"1"
],
"status": [],
"value": [],
"gasLimit": [],
"gasUsed": [],
"fee": [],
"from": [],
"to": [],
"function": [],
"eventEmitted": [
{
"contract": {
"address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d",
"invocationType": "ANY"
},
"id": null,
"name": "LogSetDefaultImplementation"
},
{
"contract": {
"address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d",
"invocationType": "ANY"
},
"id": null,
"name": "LogAddImplementation"
},
{
"contract": {
"address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d",
"invocationType": "ANY"
},
"id": null,
"name": "LogRemoveImplementation"
}
],
"logEmmitted": []
}
],
"and": null
}
}
},
"commitish": null,
"source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet: 0x3bdf5a48174f7f8f7bfb2f43dbe399c47405bba1cea3480aa0c199270f262f7e\nexport const implementationFn: ActionFn = async (context: Context, event: Event) => {\n let txEvent = event as TransactionEvent;\n console.log('InstaDapp Implementation Event is detected');\n // Shorten logs because it's too large to print\n console.log({ ...txEvent, logs: txEvent.logs.splice(0, 5) });\n};\n",
"createdAt": "2022-10-18T12:37:10.392964Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": false,
"createdAt": "2022-10-18T12:24:51.187849Z",
"deliveryChannels": null
},
{
"id": "785e140d-3a15-45c0-90a7-8c54bb41e562",
"projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582",
"name": "instadapp-governance-event",
"description": "Track these 3 events: executed, queued & cancelled.",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "9d8eaac3-85cc-4c48-a557-47c36b80dd52",
"index": 3,
"actionId": "785e140d-3a15-45c0-90a7-8c54bb41e562",
"parentActionId": "",
"runtime": "V1",
"function": "instadappGovernance:governanceFn",
"triggerType": "TRANSACTION",
"trigger": {
"type": "transaction",
"transaction": {
"status": [
"MINED"
],
"filter": {
"any": [
{
"network": [
"1"
],
"status": [],
"value": [],
"gasLimit": [],
"gasUsed": [],
"fee": [],
"from": [],
"to": [],
"function": [],
"eventEmitted": [
{
"contract": {
"address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b",
"invocationType": "ANY"
},
"id": null,
"name": "ProposalCanceled"
},
{
"contract": {
"address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b",
"invocationType": "ANY"
},
"id": null,
"name": "ProposalQueued"
},
{
"contract": {
"address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b",
"invocationType": "ANY"
},
"id": null,
"name": "ProposalExecuted"
}
],
"logEmmitted": []
}
],
"and": null
}
}
},
"commitish": null,
"source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet: 0x338fda662797c4750d6c81bc261380ca4782cf8112227f53962f4fb60d13bbcb\nexport const governanceFn: ActionFn = async (context: Context, event: Event) => {\n let txEvent = event as TransactionEvent;\n console.log('InstaDapp Governance Event is detected');\n // Shorten logs because it's too large to print\n console.log({ ...txEvent, logs: txEvent.logs.splice(0, 2) });\n};\n",
"createdAt": "2022-10-18T12:37:10.370654Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": false,
"createdAt": "2022-10-18T12:24:51.154171Z",
"deliveryChannels": null
},
{
"id": "02a83586-aabb-45c6-9ea5-23e089879b22",
"projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582",
"name": "blacklisted-addresses",
"description": "This Web3 Action detects transactions that involve blacklisted addresses.",
"status": "DEPLOYED",
"stopped": false,
"version": {
"id": "900f7a5f-cb71-4f46-9e82-51fded6d8691",
"index": 3,
"actionId": "02a83586-aabb-45c6-9ea5-23e089879b22",
"parentActionId": "",
"runtime": "V1",
"function": "blacklistedAddresses:blacklistedAddressFn",
"triggerType": "TRANSACTION",
"trigger": {
"type": "transaction",
"transaction": {
"status": [
"MINED"
],
"filter": {
"any": [
{
"network": [
"1"
],
"status": [],
"value": [],
"gasLimit": [],
"gasUsed": [],
"fee": [],
"from": [
{
"exact": "0xf38b4de019aca232711d7b7abae59adc93efc3e9"
},
{
"exact": "0x6B175474E89094C44Da98b954EedeAC495271d0F"
},
{
"exact": "0xa40dfee99e1c85dc97fdc594b16a460717838703"
}
],
"to": [],
"function": [],
"eventEmitted": [],
"logEmmitted": []
}
],
"and": null
}
}
},
"commitish": null,
"source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet with write storage type: 0x7295b1bdfc6b277c10a4b8b6002183c005f4512a4d1537a0a81b0ff3eb6fe6c9\nexport const blacklistedAddressFn: ActionFn = async (context: Context, event: Event) => {\n const blacklistedAddresses = [\n '0xf38b4de019aca232711d7b7abae59adc93efc3e9',\n '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n '0xa40dfee99e1c85dc97fdc594b16a460717838703',\n ];\n let txEvent = event as TransactionEvent;\n console.log('Blacklisted Addresses:', blacklistedAddresses);\n console.log(`Blacklisted Address: ${txEvent.from}`);\n console.log(`Tx Hash: ${txEvent.hash}`);\n console.log('Contains:', blacklistedAddresses.includes(txEvent.from));\n await context.storage.putStr(`Blacklisted Address: ${txEvent.from}`, txEvent.hash);\n};\n",
"createdAt": "2022-10-18T12:37:10.333383Z",
"deployRequested": false,
"deployError": null,
"invocationType": "SYNC"
},
"editable": false,
"createdAt": "2022-10-18T12:24:51.082156Z",
"deliveryChannels": null
}
]{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "bad_request",
"message": "Bad request input parameters"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "unauthorized",
"message": "Unauthorized"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "insufficient_permissions",
"message": "Insufficient permissions"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "resource_not_found",
"message": "The resource you requested could not be found."
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "internal_server_error",
"message": "Internal server error"
}
}Authorizations
An API key is a token that a client provides when making API calls. Send it as the X-Access-Key request header on any endpoint:
curl '<API_ENDPOINT>' \ -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \ ...
Learn how to generate API access tokens at Tenderly Docs.
Path Parameters
Account slug of the user
Project slug of the account
Response
A successful response.
ID of the Web3 Action.
"4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25"
ID of the project where Web3 Action is created.
"dfdc391a-a15d-4590-9aef-8691259c7df4"
Web3 Action name.
"periodic-cron"
Web3 Action description.
"Triggers every 1 hour"
Status of the Web3 Action.
DEPLOYED, PUBLISHED "DEPLOYED"
Flag showing if Web3 Action is stopped or not.
false
Flag showing if Web3 Action is editable or not.
true
When Web3 Action is created.
"2023-12-14T16:20:36.078679Z"
Show child attributes
Show child attributes
{ "id": "65f4e0e8-4b67-4f0c-815f-1a08cd418f1a", "index": 1, "actionId": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25", "parentActionId": "", "runtime": "V2", "function": "implementation:actionFn", "triggerType": "PERIODIC", "trigger": { "type": "periodic", "periodic": { "cron": "0 * * * *", "interval": "1h" } }, "commitish": null, "source": "// Do not change function name.\nconst actionFn = async (context, periodicEvent) => {\n console.log(periodicEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }", "createdAt": "2023-12-14T16:20:36.078679Z", "deployRequested": false, "deployError": null, "invocationType": "SYNC" }
Shows delivery channels for given Web3 Action.
[]
[ { "id": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25", "projectId": "dfdc391a-a15d-4590-9aef-8691259c7df4", "name": "periodic-cron", "description": "every 1 hour", "status": "DEPLOYED", "stopped": false, "version": { "id": "65f4e0e8-4b67-4f0c-815f-1a08cd418f1a", "index": 1, "actionId": "4cc3ee95-6bc5-4c85-83d0-26d4b89d5c25", "parentActionId": "", "runtime": "V2", "function": "implementation:actionFn", "triggerType": "PERIODIC", "trigger": { "type": "periodic", "periodic": { "cron": "0 * * * *", "interval": "1h" } }, "commitish": null, "source": "// Do not change function name.\nconst actionFn = async (context, periodicEvent) => {\n console.log(periodicEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }", "createdAt": "2023-12-14T16:20:36.078679Z", "deployRequested": false, "deployError": null, "invocationType": "SYNC" }, "editable": true, "createdAt": "2023-12-14T16:20:36.078679Z", "deliveryChannels": null }, { "id": "74e9f7d8-4a53-425c-912b-8d5cef87cef1", "projectId": "dfdc391a-a15d-4590-9aef-8691259c7df4", "name": "mainnet-block", "description": "Trigger on every 1000th block", "status": "DEPLOYED", "stopped": true, "version": { "id": "ac015512-fcca-4a94-b782-e1fb584d8aef", "index": 1, "actionId": "74e9f7d8-4a53-425c-912b-8d5cef87cef1", "parentActionId": "", "runtime": "V2", "function": "implementation:actionFn", "triggerType": "BLOCK", "trigger": { "type": "block", "block": { "network": ["1"], "blocks": 1000 } }, "commitish": null, "source": "// Do not change function name.\nconst actionFn = async (context, blockEvent) => {\n console.log(blockEvent)\n\n // To access project's secret\n // let secret = await context.secrets.get('MY-SECRET')\n\n // To access project's storage\n // let value = await context.storage.getStr('MY-KEY')\n // await context.storage.putStr('MY-KEY', 'MY-VALUE')\n\n // Your logic goes here :)\n}\n// Do not change this.\nmodule.exports = { actionFn }", "createdAt": "2023-12-13T00:37:13.821647Z", "deployRequested": false, "deployError": null, "invocationType": "ASYNC" }, "editable": true, "createdAt": "2023-12-13T00:37:13.821647Z", "deliveryChannels": null }, { "id": "be048c73-41c3-4fcd-b0c6-d286af7155fe", "projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582", "name": "instadapp-implementation", "description": "Track these 3 proposal events: add, remove & setDefault.", "status": "DEPLOYED", "stopped": false, "version": { "id": "34655755-771f-4da7-989e-ec2b27e8f13b", "index": 3, "actionId": "be048c73-41c3-4fcd-b0c6-d286af7155fe", "parentActionId": "", "runtime": "V1", "function": "instadappImplementation:implementationFn", "triggerType": "TRANSACTION", "trigger": { "type": "transaction", "transaction": { "status": ["MINED"], "filter": { "any": [ { "network": ["1"], "status": [], "value": [], "gasLimit": [], "gasUsed": [], "fee": [], "from": [], "to": [], "function": [], "eventEmitted": [ { "contract": { "address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d", "invocationType": "ANY" }, "id": null, "name": "LogSetDefaultImplementation" }, { "contract": { "address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d", "invocationType": "ANY" }, "id": null, "name": "LogAddImplementation" }, { "contract": { "address": "0xcba828153d3a85b30b5b912e1f2dacac5816ae9d", "invocationType": "ANY" }, "id": null, "name": "LogRemoveImplementation" } ], "logEmmitted": [] } ], "and": null } } }, "commitish": null, "source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet: 0x3bdf5a48174f7f8f7bfb2f43dbe399c47405bba1cea3480aa0c199270f262f7e\nexport const implementationFn: ActionFn = async (context: Context, event: Event) => {\n let txEvent = event as TransactionEvent;\n console.log('InstaDapp Implementation Event is detected');\n // Shorten logs because it's too large to print\n console.log({ ...txEvent, logs: txEvent.logs.splice(0, 5) });\n};\n", "createdAt": "2022-10-18T12:37:10.392964Z", "deployRequested": false, "deployError": null, "invocationType": "SYNC" }, "editable": false, "createdAt": "2022-10-18T12:24:51.187849Z", "deliveryChannels": null }, { "id": "785e140d-3a15-45c0-90a7-8c54bb41e562", "projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582", "name": "instadapp-governance-event", "description": "Track these 3 events: executed, queued & cancelled.", "status": "DEPLOYED", "stopped": false, "version": { "id": "9d8eaac3-85cc-4c48-a557-47c36b80dd52", "index": 3, "actionId": "785e140d-3a15-45c0-90a7-8c54bb41e562", "parentActionId": "", "runtime": "V1", "function": "instadappGovernance:governanceFn", "triggerType": "TRANSACTION", "trigger": { "type": "transaction", "transaction": { "status": ["MINED"], "filter": { "any": [ { "network": ["1"], "status": [], "value": [], "gasLimit": [], "gasUsed": [], "fee": [], "from": [], "to": [], "function": [], "eventEmitted": [ { "contract": { "address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b", "invocationType": "ANY" }, "id": null, "name": "ProposalCanceled" }, { "contract": { "address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b", "invocationType": "ANY" }, "id": null, "name": "ProposalQueued" }, { "contract": { "address": "0x0204cd037b2ec03605cfdfe482d8e257c765fa1b", "invocationType": "ANY" }, "id": null, "name": "ProposalExecuted" } ], "logEmmitted": [] } ], "and": null } } }, "commitish": null, "source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet: 0x338fda662797c4750d6c81bc261380ca4782cf8112227f53962f4fb60d13bbcb\nexport const governanceFn: ActionFn = async (context: Context, event: Event) => {\n let txEvent = event as TransactionEvent;\n console.log('InstaDapp Governance Event is detected');\n // Shorten logs because it's too large to print\n console.log({ ...txEvent, logs: txEvent.logs.splice(0, 2) });\n};\n", "createdAt": "2022-10-18T12:37:10.370654Z", "deployRequested": false, "deployError": null, "invocationType": "SYNC" }, "editable": false, "createdAt": "2022-10-18T12:24:51.154171Z", "deliveryChannels": null }, { "id": "02a83586-aabb-45c6-9ea5-23e089879b22", "projectId": "cbb49e29-24ad-4cf9-8b2d-1f34a3019582", "name": "blacklisted-addresses", "description": "This Web3 Action detects transactions that involve blacklisted addresses.", "status": "DEPLOYED", "stopped": false, "version": { "id": "900f7a5f-cb71-4f46-9e82-51fded6d8691", "index": 3, "actionId": "02a83586-aabb-45c6-9ea5-23e089879b22", "parentActionId": "", "runtime": "V1", "function": "blacklistedAddresses:blacklistedAddressFn", "triggerType": "TRANSACTION", "trigger": { "type": "transaction", "transaction": { "status": ["MINED"], "filter": { "any": [ { "network": ["1"], "status": [], "value": [], "gasLimit": [], "gasUsed": [], "fee": [], "from": [ { "exact": "0xf38b4de019aca232711d7b7abae59adc93efc3e9" }, { "exact": "0x6B175474E89094C44Da98b954EedeAC495271d0F" }, { "exact": "0xa40dfee99e1c85dc97fdc594b16a460717838703" } ], "to": [], "function": [], "eventEmitted": [], "logEmmitted": [] } ], "and": null } } }, "commitish": null, "source": "import {\n ActionFn,\n Context,\n Event,\n TransactionEvent,\n} from '@tenderly/actions';\n\n// TEST: Try manual trigger with this tx hash on Mainnet with write storage type: 0x7295b1bdfc6b277c10a4b8b6002183c005f4512a4d1537a0a81b0ff3eb6fe6c9\nexport const blacklistedAddressFn: ActionFn = async (context: Context, event: Event) => {\n const blacklistedAddresses = [\n '0xf38b4de019aca232711d7b7abae59adc93efc3e9',\n '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n '0xa40dfee99e1c85dc97fdc594b16a460717838703',\n ];\n let txEvent = event as TransactionEvent;\n console.log('Blacklisted Addresses:', blacklistedAddresses);\n console.log(`Blacklisted Address: ${txEvent.from}`);\n console.log(`Tx Hash: ${txEvent.hash}`);\n console.log('Contains:', blacklistedAddresses.includes(txEvent.from));\n await context.storage.putStr(`Blacklisted Address: ${txEvent.from}`, txEvent.hash);\n};\n", "createdAt": "2022-10-18T12:37:10.333383Z", "deployRequested": false, "deployError": null, "invocationType": "SYNC" }, "editable": false, "createdAt": "2022-10-18T12:24:51.082156Z", "deliveryChannels": null } ]
Was this page helpful?