Platform

TAN: Telcoin Distributor

The Telcoin Distributor allows funds from a Gnosis Safes to be used in transactions proposed by semi-trusted parties without requiring a snapshot vote. This is useful for regular maintenance tasks, like a weekly airdrop for example.

System Overview

The Telcoin Distributor allows Safe Wallets to execute transactions proposed by semi-trusted parties without requiring a snapshot vote. This is useful for regular maintenance tasks, like a weekly airdrop for example.

In Telcoin Governance, each individual council member is considered untrusted or semi-trusted, but a supermajority of any council is considered trusted. To expedite regular maintenance transactions, the Telcoin Distributor allows any one council member to propose a transaction to be executed by their Safe Wallet. However, because they are individually untrustworthy, their proposed transaction is subject to a delay called the “challenge period.” During the challenge period, any other council member can challenge the transaction if it is malicious, preventing its execution.

How it Works

The Telcoin Distributor contract is deployed for each council that uses this mechanism, and it is added as a module to their Gnosis Safe.

The Telcoin Distributor has CouncilMember role that allows proposal creation and the challenge of a proposal. Proposed transactions receive funds from the Gnosis Safe. Challengers are able to challenge transactions during the challenge period.

This specific implementation of the contract defines Council NFT holders as proposers and challengers. The challenge period duration is 72 hours, this value can be changed.

To perform a transaction without going through a Snapshot vote, a proposer calls proposeTransaction. After the proposal is made, the transaction is added to a list of proposed transactions which can be accessed via proposedTransactions(uint256). The transaction is now in the challenge period.

During the challenge period, a challenger can call challengeTransaction to prevent it from being executed. If a challenge is made the proposal can no longer be executed and must be resubmitted or go through the snapshot protocol.

Finally, once the challenge period of a transaction has elapsed and it has not been challenged, it is executable.

Contract Functions

Proposer Functions

	 /**
     * @notice Proposes a new transaction to be added to the queue
     * @dev The function checks if the sender is a proposer before allowing the
		 * transaction proposal
     * @dev A transaction proposed can be challenged during the challenge period
     * @param totalWithdrawl Total amount of Telcoin to be taken from safe
     * @param destinations Locations of Telcoin dispursals
     * @param amounts Amounts of Telcoin to be sent
     */
    function proposeTransaction(
        uint256 totalWithdrawl,
        address[] memory destinations,
        uint256[] memory amounts
    ) external onlyCouncilMember whenNotPaused;

Challenge Function

		/**
     * @notice Allows a challenger to challenge a proposed transaction
     * @dev The function reverts if the caller is not a challenger, the 
		 * transacion timestamp is invalid, or the challenge period has expired.
     * It sets the transaction's challenged flag to true if successful.
     * @param transactionId uint256 The ID of the transaction to challenge
     */
    function challengeTransaction(
        uint256 transactionId
    ) external onlyCouncilMember whenNotPaused;

Execution Functions

		/**
     * @notice Execute transaction
     * @param transactionId The transaction ID.
     */
    function executeTransaction(
        uint256 transactionId
    ) external;