API Task
This Dynamic Oracle implementation allows your smart contract to execute a pre deployed Truebit API Task, providing off-chain computation with on-chain guarantees.
1. Inherit From BaseTBContract
Import BaseTBContract.sol contract and extend from it.
2. Constructor
When deploying the contract, ensure you set the correct values for both watchTowerAddress and sourceCode within your contract:
watchTowerAddress:
0xEcd0EeD24Ed6a54d05a07125c4ccb809b3A09868sourceCode: Leave it as an empty string (
"")
3. Submitting a Request
In your contract, to execute JS code on Truebit, call the _requestExecution function. This will trigger the task execution on the Truebit platform
To Call the _requestExecution You must:
Define the method signature string
Encode all parameters using
abi.encodeSpecify the execution type as:
DOTypes.ExecutionType.API
Method Signature
The method signature must follow a strict format. It begins with the method name (in this case, "request"), followed by parentheses containing the parameter definitions, separated by commas.
The following parameters are required and must appear in this exact order with the specified names:
namespace, taskname, method, path, executionTimeout, async
Depending on your API call, you may also include:
params()— if your endpoint uses path or query parametersbody— if your call includes a request body (e.g. for POST/PUT)
If params() is required, you must specify the key and type inside the parentheses, for example:
params(orderId:uint256)Multiple arameters can be separated by commas.
If body is also needed, it should appear after params() or async, depending on whether parameters are present.
Examples:
Only params:
request(namespace,taskname,method,path,executionTimeout,async,params(orderId:uint256))Only body:
request(namespace,taskname,method,path,executionTimeout,async,body)Both params and body:
request(namespace,taskname,method,path,executionTimeout,async,params(orderId:uint256),body)Filling The Payload
Once the method signature is defined, you must fill the payload with the values for the parameter defined on the signature, and encode it using abi.encode(...).
The payload values are the following:
The namespace where the task was deployed.
The name of the task defined at deployment.
The HTTP method to call (GET, POST, PUT, DELETE, PATCH)
The endpoint path you want to call in your Truebit API task.
The executionTimeout (e.g. 100000)
The async flag:
true→ returns anexecutionIdimmediately.false→ waits until the task completes and returns the response.
(Optional) Any path/query parameters
(Optional) The body content
Call _requestExecution
Finally, you call _requestExecution() with:
The method signature (string)
The encoded payload (bytes)
The execution type:
DOTypes.ExecutionType.API
bytes memory payload = abi.encode(
'Your Namespace', // namespace - identifies the API collection
'Your Taskname', // taskname - specific API task to execute
'GET', // HTTP method
'/store/order/{orderId}', // API endpoint path
100000, // executionTimeout - max time for execution
false, // async - whether to run asynchronously
orderId // orderId - the parameter for the API call
);
// Submit the execution request to the Truebit network
uint256 wtExecutionId = _requestExecution(
"request(namespace,taskname,method,path,executionTimeout,async,params(orderId:uint256))",
payload,
DOTypes.ExecutionType.API
);4. Handling The callback
When the execution is finished, your will receive the result within the callbackTask
function callbackTask(
bytes calldata resultData,
string[] memory transcripts,
uint256 wtExecutionId,
uint8 status,
string memory callbackMessageDetails
) external override onlywatchTower {resultData: The encoded result data from the execution
transcripts: Array of execution transcripts for verification
wtExecutionId: The execution identifier
status: Execution status (0 = success, >0 = error)
callbackMessageDetails: Additional details about the execution
5. Grant permissions
User Contract permission
In order to authorize the user contract, the task developer must grant permissions to the user contract over the namespace called in the _requestExecution. To do so, please use the following CLI command
truebit auth grant <namespace_to_grant> <address_grantee>namespace_to_grant: namespace mentioned in _requestExecutionaddress_grantee: Contract address
Truebit Verify Hub access
Each user who wants to execute API or Function Tasks via Dynamic Oracle must grant permissions to the Truebit Verify address to complete the connection. For example:
truebit auth grant <namespace_to_grant> <truebit_hub_address>namespace_to_grant: namespace mentioned in _requestExecutiontruebit_hub_address: 0xd70C3454aaD1B7ec660a064d8b1FE5708d898d84
Last updated
Was this helpful?