Skip to main content

AccountExtension

import "@thirdweb-dev/contracts/smart-wallet/utils/AccountExtension.sol";

The AccountExtension smart contract is the extension usable with the Dynamic and Managed Account smart contracts. It is the default extension for these base contracts. It includes the default logic for creating a smart account smart contract including the ability to:

  • Have multiple owners
  • Execute transactions (single and batched).
  • Send and receive native tokens.
  • Send and receive ERC-721 and ERC-1155 NFTs.
  • Multicall-able.
  • Store contract metadata.

Usage​

This is an example smart contract demonstrating how to inherit from this extension and override the functions to add (optional) custom functionality.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@thirdweb-dev/contracts/smart-wallet/utils/AccountExtension.sol";

contract MyDynamicAccount is AccountExtension { ... }

Inherited Extensions​

This extension inherits from the following extensions:

Base Contracts Implementing This Extension​

Full API reference​

execute

Executes a transaction (called directly from an admin, or by entryPoint)

function execute(
address _target,
uint256 _value,
bytes calldata _calldata
) external virtual onlyAdminOrEntrypoint {
_call(_target, _value, _calldata);
}

_target​

The target contract to call.

_value​

The amount of native tokens to send to the target contract.

_calldata​

The bytes calldata to send to the target contract.

executeBatch

Executes a sequence transaction (called directly from an admin, or by entryPoint)

function executeBatch(
address[] calldata _target,
uint256[] calldata _value,
bytes[] calldata _calldata
) external virtual onlyAdminOrEntrypoint {
require(_target.length == _calldata.length && _target.length == _value.length, "Account: wrong array lengths.");
for (uint256 i = 0; i < _target.length; i++) {
_call(_target[i], _value[i], _calldata[i]);
}
}

_target​

The target contracts to call.

_value​

The amounts of native tokens to send to the target contracts.

_calldata​

The bytes calldata to send to the target contracts.

_call

Calls a target contract and reverts if it fails.

function _call(
address _target,
uint256 value,
bytes memory _calldata
) internal {
(bool success, bytes memory result) = _target.call{ value: value }(_calldata);
if (!success) {
assembly {
revert(add(result, 32), mload(result))
}
}
}

_target​

The target contract to call.

_value​

The amount of native tokens to send to the target contract.

_calldata​

The bytes calldata to send to the target contract.

_canSetContractURI

Returns whether contract metadata can be set in the given execution context.

function _canSetContractURI() internal view virtual override returns (bool) {
return hasRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
_setupRole

Registers a signer in the factory.

function _setupRole(bytes32 role, address account) internal virtual override {
super._setupRole(role, account);
if (role == SIGNER_ROLE && factory.code.length > 0) {
IAccountFactory(factory).addSigner(account);
}
}

role​

The role to set up. Must be of type bytes32.

account​

The address of the account to register for the role.

_revokeRole

Un-registers a signer in the factory.

function _revokeRole(bytes32 role, address account) internal virtual override {
super._revokeRole(role, account);
if (role == SIGNER_ROLE && factory.code.length > 0) {
IAccountFactory(factory).removeSigner(account);
}
}

role​

The role to revoke. Must be of type bytes32.

account​

The address of the account to un-register for the role.