Skip to main content

Access control

Define access controllers for your tables with the SDK.


The Tableland SDK works with the standard access control paradigms: smart contract controllers, or GRANT/REVOKE statements. This page will walk through simple examples for how to configure access rules for your tables.

Basic access control

With GRANT and REVOKE statements, you can prepare a statement and define what a specific address can do. For example, if you wanted to add another "admin" to the table with full access permissions on writing data, you could execute the following:

import { Database } from "@tableland/sdk";

// Assuming you've instantiated a `signer`
const db = new Database({ signer });
const tableName = "my_table_31337_2"; // Your table name

const { meta } = await db
.prepare(
`GRANT INSERT, UPDATE, DELETE ON ${tableName} TO '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'`
)
.run();
await meta.txn?.wait();

Thus, if the account 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC tries to write to the table, they'll have full permissions.

Advanced control with controllers

There is no native support in the SDK for deploying controllers, which are smart contracts that define an access control policy, which are more dynamic than the GRANT/REVOKE feature. But, once a controller contract is deployed, you can the use the SDK's Registry API to set the controller.

Let's say you've deployed a contract that has "allow all" permissions at address 0x83a4bE0B792996f3b607f28cFD98f4E82AFcDD20 (note: this is a real contract on Sepolia). Then, you can use the setController method to, basically, state: this address is a controller contract that should dictate access controls for my table. Here's what it would look like:

import { Registry } from "@tableland/sdk";

// Assuming you've instantiated a `signer`
const registry = new Registry({ signer });
const tableName = "my_table_11155111_2"; // Your table name
const controller = "0x83a4bE0B792996f3b607f28cFD98f4E82AFcDD20";

const tx = await registry.setController({
tableName,
controller,
});
await tx.wait();
tip

Remix makes it really easy to deploy one-off smart contracts. You can create one of the example controllers and sign/send the transaction using your browser wallet, making it straightforward to add more flexible access controls without much Solidity experience.