Arbitrum Stylus logo

Stylus by Example

MultiSig Wallet

An Arbitrum Stylus version implementation of Solidity MultiSig wallet.

The wallet owners can

  • submit a transaction
  • approve and revoke approval of pending transactions
  • anyone can execute a transaction after enough owners has approved it

Here is the interface for MultiSig wallet.

1interface IMultiSig {
2    function numConfirmationsRequired() external view returns (uint256);
3
4    function deposit() external payable;
5
6    function submitTransaction(address to, uint256 value, bytes calldata data) external;
7
8    function initialize(address[] memory owners, uint256 num_confirmations_required) external;
9
10    function executeTransaction(uint256 tx_index) external;
11
12    function confirmTransaction(uint256 tx_index) external;
13
14    function revokeConfirmation(uint256 tx_index) external;
15
16    function isOwner(address check_address) external view returns (bool);
17
18    function getTransactionCount() external view returns (uint256);
19
20    error AlreadyInitialized();
21
22    error ZeroOwners();
23
24    error InvaildConfirmationNumber();
25
26    error InvalidOwner();
27
28    error OwnerNotUnique();
29
30    error NotOwner();
31
32    error TxDoesNotExist();
33
34    error TxAlreadyExecuted();
35
36    error TxAlreadyConfirmed();
37
38    error TxNotConfirmed();
39
40    error ConfirmationNumberNotEnough();
41
42    error ExecuteFailed();
43}
1interface IMultiSig {
2    function numConfirmationsRequired() external view returns (uint256);
3
4    function deposit() external payable;
5
6    function submitTransaction(address to, uint256 value, bytes calldata data) external;
7
8    function initialize(address[] memory owners, uint256 num_confirmations_required) external;
9
10    function executeTransaction(uint256 tx_index) external;
11
12    function confirmTransaction(uint256 tx_index) external;
13
14    function revokeConfirmation(uint256 tx_index) external;
15
16    function isOwner(address check_address) external view returns (bool);
17
18    function getTransactionCount() external view returns (uint256);
19
20    error AlreadyInitialized();
21
22    error ZeroOwners();
23
24    error InvaildConfirmationNumber();
25
26    error InvalidOwner();
27
28    error OwnerNotUnique();
29
30    error NotOwner();
31
32    error TxDoesNotExist();
33
34    error TxAlreadyExecuted();
35
36    error TxAlreadyConfirmed();
37
38    error TxNotConfirmed();
39
40    error ConfirmationNumberNotEnough();
41
42    error ExecuteFailed();
43}

Example implementation of a MultiSig Wallet contract written in Rust.

src/lib.rs

1Loading...
1Loading...

Cargo.toml

1Loading...
1Loading...

src/main.rs

1Loading...
1Loading...