These docs are being revamped as part of the platform transition and may be out of date. Reach out to support if assistance is needed.
How to Use TallyCreating ProposalsImport & export proposal actions

Import & export proposal actions

Export and import proposal actions as JSON files to verify calldata externally, reuse proposal configurations, and reduce errors when creating complex proposals.

Note: This feature is currently available for ENS governance.

Export proposal actions

1) Navigate to the Proposal Builder

Go to your DAO’s governance page and click Create Proposal to access the proposal builder.

2) Configure & export

  • Set up your proposal actions (contract calls, custom transactions, etc.)
  • Click Export Actions to download a JSON file with all action data

Import proposal actions

1) Access and Import

In the proposal builder:

  • Click Import Actions
  • Upload a JSON file (max 1 MB) or paste JSON directly
  • Click Import to load the actions
  • Tally validates the structure and displays clear error messages if needed

Required JSON Format

Your JSON file must follow the Safe Transaction Builder format. This format is compatible with Safe wallets.

Basic Structure

{
  "version": "1.0",
  "chainId": "1",
  "createdAt": 1731063959080,
  "meta": {
    "name": "Transactions Batch",
    "description": "",
    "txBuilderVersion": "1.17.1",
    "createdFromSafeAddress": "",
    "createdFromOwnerAddress": "",
    "checksum": ""
  },
  "transactions": [
    {
      "to": "0xb1040D3ce131b3204E5229C80a8d5Ae271B2ef09",
      "value": "1000000000000000000",
      "data": null,
      "contractMethod": {
        "inputs": [],
        "name": "transfer",
        "payable": true
      },
      "contractInputsValues": null
    }
  ]
}

Top level fields

FieldDescription
versionMust be "1.0"
chainIdNetwork chain ID as a string (e.g., "1" for Ethereum mainnet)
createdAtUnix timestamp in milliseconds
meta (optional)Metadata object describing the batch
transactionsArray of transaction objects (max 10 actions)

Transactional object fields

Each transaction in the transactions array supports the following fields:

FieldDescription
toTarget contract address
valueAmount of native token (ETH) to send in wei (string)
dataABI-encoded calldata (null for native transfers)
contractMethodFunction metadata object
contractInputsValuesOptional decoded parameter values

Examples

Native token transfer

{
  "version": "1.0",
  "chainId": "1",
  "createdAt": 1731063959080,
  "meta": {
    "name": "ETH Transfer",
    "description": "Send 1 ETH",
    "txBuilderVersion": "1.17.1"
  },
  "transactions": [
    {
      "to": "0xb1040D3ce131b3204E5229C80a8d5Ae271B2ef09",
      "value": "1000000000000000000",
      "data": null,
      "contractMethod": {
        "inputs": [],
        "name": "transfer",
        "payable": true
      },
      "contractInputsValues": null
    }
  ]
}

ERC20 token transfer

{
  "version": "1.0",
  "chainId": "1",
  "createdAt": 1731063959080,
  "meta": {
    "name": "USDC Transfer",
    "description": "Transfer 1000000 USDC"
  },
  "transactions": [
    {
      "to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "value": "0",
      "data": "0xa9059cbb000000000000000000000000b1040d3ce131b3204e5229c80a8d5ae271b2ef0900000000000000000000000000000000000000000000000000000000000f4240",
      "contractMethod": {
        "inputs": [
          {
            "name": "recipient",
            "type": "address"
          },
          {
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "transfer",
        "payable": false
      },
      "contractInputsValues": {
        "recipient": "0xb1040D3ce131b3204E5229C80a8d5Ae271B2ef09",
        "amount": "1000000"
      }
    }
  ]
}

Custom contract call

{
  "version": "1.0",
  "chainId": "1",
  "createdAt": 1731063959080,
  "meta": {
    "name": "USDC Transfer",
    "description": "Transfer 1000000 USDC"
  },
  "transactions": [
    {
      "to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "value": "0",
      "data": "0xa9059cbb000000000000000000000000b1040d3ce131b3204e5229c80a8d5ae271b2ef0900000000000000000000000000000000000000000000000000000000000f4240",
      "contractMethod": {
        "inputs": [
          {
            "name": "recipient",
            "type": "address"
          },
          {
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "transfer",
        "payable": false
      },
      "contractInputsValues": {
        "recipient": "0xb1040D3ce131b3204E5229C80a8d5Ae271B2ef09",
        "amount": "1000000"
      }
    }
  ]
}

Note: The data field contains ABI-encoded calldata and is difficult to write manually. We recommend exporting existing actions or using Safe’s Transaction Builder to generate the correct format.