Address Contract Verified
Address
0x4bd4D6f953bd119082Af3fc1c67Fc43e4956eDFD
Balance
0 ETH
Nonce
1
Code Size
4921 bytes
Creator
0x78e9e6c4...e6Ef at tx 0x1987604d...27443d
Indexed Transactions
0
Contract Bytecode
4921 bytes
0x60806040526004361015610022575b3615610018575f80fd5b6100206112b2565b005b5f3560e01c806308aff933146100e1578063242232d1146100dc5780633b38e8b0146100d75780635fc89b90146100d257806363a8374d146100cd578063685067d5146100c85780638ad257b7146100c357806399c1aadc146100be578063d8e7d36a146100b9578063ec096f8d146100b4578063f81fc230146100af5763fe9fbb800361000e576107cb565b61078a565b610771565b610674565b6105fc565b6105b4565b610520565b6104ef565b610258565b610240565b610223565b6101dd565b805b036100ef57565b5f80fd5b90503590610100826100e6565b565b6001600160a01b031690565b90565b6001600160a01b0381166100e8565b9050359061010082610111565b91906040838203126100ef5761010e9061014781856100f3565b93602001610120565b61010e61010e61010e9290565b9061016790610150565b5f5260205260405f2090565b61010261010e61010e926001600160a01b031690565b61010e90610173565b61010e90610189565b9061016790610192565b61010e916008021c5b60ff1690565b9061010e91546101a5565b6101d861010e926101d36003935f9461015d565b61019b565b6101b4565b346100ef5761020b6101f96101f336600461012d565b906101bf565b60405191829182901515815260200190565b0390f35b906020828203126100ef5761010e916100f3565b346100ef5761023b61023636600461020f565b610aa8565b604051005b346100ef5761023b61025336600461020f565b610bdf565b346100ef5761023b61026b36600461020f565b610e33565b634e487b7160e01b5f52603260045260245ffd5b80548210156102a45761029c6005915f5260205f2090565b910201905f90565b610270565b61010e90610102565b61010e90546102a9565b61010e9081565b61010e90546102bc565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015610301575b60208310146102fc57565b6102cd565b91607f16916102f1565b80545f93929161032761031d836102e1565b8085529360200190565b9160018116908115610376575060011461034057505050565b61035191929394505f5260205f2090565b915f925b8184106103625750500190565b805484840152602090930192600101610355565b92949550505060ff1916825215156020020190565b9061010e9161030b565b634e487b7160e01b5f52604160045260245ffd5b90601f01601f1916810190811067ffffffffffffffff8211176103cb57604052565b610395565b906101006103ea926103e160405190565b9384809261038b565b03836103a9565b61010e906101ae565b61010e90546103f1565b60049061040f825490565b8110156100ef5761041f91610284565b50610429816102b2565b91610436600183016102c3565b91610443600282016103d0565b9161010e6004610455600385016103fa565b93016102c3565b90825f9392825e0152565b61048861049160209361049b9361047c815190565b80835293849260200190565b9586910161045c565b601f01601f191690565b0190565b906104e16104eb91610100969897956104d46080966104cd60a08801945f8901906001600160a01b03169052565b6020870152565b8482036040860152610467565b9615156060830152565b0152565b346100ef5761020b61050a61050536600461020f565b610404565b9161051795939560405190565b9586958661049f565b346100ef5761020b61050a61053636600461020f565b610e45565b5f9103126100ef57565b9061056561055e610554845190565b8084529260200190565b9260200190565b905f5b8181106105755750505090565b90919261059b61059460019286516001600160a01b0316815260200190565b9460200190565b929101610568565b602080825261010e92910190610545565b346100ef576105c436600461053b565b61020b6105cf610f2b565b604051918291826105a3565b61010e916008021c81565b9061010e91546105db565b61010e5f60026105e6565b346100ef5761060c36600461053b565b61020b6106176105f1565b6040519182918290815260200190565b80548210156102a45761029c6001915f5260205f2090565b61010e916008021c610102565b9061010e915461063f565b5f80548210156100ef5761010e9161066e91610627565b9061064c565b346100ef5761020b61068f61068a36600461020f565b610657565b604051918291826001600160a01b03909116815260200190565b906101006106b660405190565b92836103a9565b67ffffffffffffffff81116103cb57602090601f01601f19160190565b90825f939282370152565b909291926106fa6106f5826106bd565b6106a9565b938185526020850190828401116100ef57610100926106da565b9080601f830112156100ef5781602061010e933591016106e5565b916060838303126100ef576107448284610120565b9261075283602083016100f3565b92604082013567ffffffffffffffff81116100ef5761010e9201610714565b346100ef5761023b61078436600461072f565b91611294565b346100ef5761079a36600461053b565b61020b61061760045490565b906020828203126100ef5761010e91610120565b61010e906101d86001915f9261019b565b346100ef5761020b6101f96107e13660046107a6565b6107ba565b156107ed57565b60405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606490fd5b6101009061084061083b61083633600161019b565b6103fa565b6107e6565b610889565b1561084c57565b60405162461bcd60e51b8152602060048201526015602482015274151c985b9cd858dd1a5bdb881b9bdd08199bdd5b99605a1b6044820152606490fd5b610100906108aa816108a46108a061010e60045490565b9190565b10610845565b6108fb565b156108b657565b60405162461bcd60e51b815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606490fd5b6101009061092561092061091c6003610915856004610284565b50016103fa565b1590565b6108af565b610976565b1561093157565b60405162461bcd60e51b815260206004820152601c60248201527f5472616e73616374696f6e20616c726561647920617070726f766564000000006044820152606490fd5b6101009061099d61099861091c61083661099185600361015d565b339061019b565b61092a565b610a12565b634e487b7160e01b5f52601160045260245ffd5b919082018092116109c357565b6109a2565b905f19905b9181191691161790565b906109e761010e6109ee92610150565b82546109c8565b9055565b9060ff906109cd565b90610a0b61010e6109ee92151590565b82546109f2565b610a4d610a27610a23836004610284565b5090565b610a476004610a366001610150565b920191610a42836102c3565b6109b6565b906109d7565b610a656001610a6061099184600361015d565b6109fb565b7ff8a17c9136a3ae33364fac05eb088a3cbafee10c1889c88593e20ee2d8e4eb8890610a99610a9333610192565b91610150565b91610aa360405190565b5f90a3565b61010090610821565b61010090610ac661083b61083633600161019b565b61010090610add816108a46108a061010e60045490565b61010090610af761092061091c6003610915856004610284565b610b55565b15610b0357565b60405162461bcd60e51b815260206004820152601760248201527f4e6f207072696f7220617070726f76616c20666f756e640000000000000000006044820152606490fd5b919082039182116109c357565b610b9f610b66610a23836004610284565b610b7f610b7a61083661099186600361015d565b610afc565b610a476004610b8e6001610150565b920191610b9a836102c3565b610b48565b610bb15f610a6061099184600361015d565b7f795394da21278ca39d59bb3ca00efeebdc0679acc420916c7385c2c5d942656f90610a99610a9333610192565b61010090610ab1565b61010090610bfd61083b61083633600161019b565b61010090610c14816108a46108a061010e60045490565b61010090610c2e61092061091c6003610915856004610284565b610d7b565b15610c3a57565b60405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420617070726f76616c73000000000000000000006044820152606490fd5b80545f939291610c95610c91836102e1565b9390565b9160018116908115610ce35750600114610cae57505050565b610cbf91929394505f5260205f2090565b5f905b838210610ccf5750500190565b600181602092548486015201910190610cc2565b60ff191683525050811515909102019150565b61010e91610c7f565b90610d0c6106f5836106bd565b918252565b3d15610d2a57610d203d610cff565b903d5f602084013e565b606090565b15610d3657565b60405162461bcd60e51b815260206004820152601c60248201527f5472616e73616374696f6e20657865637574696f6e206661696c6564000000006044820152606490fd5b610e055f80610d8e610a23856004610284565b610db4610d9d600483016102c3565b610dad6108a061010e60026102c3565b1015610c33565b610dc26001600383016109fb565b610df3610dd08383016102b2565b916002610ddf600183016102c3565b9101610dea60405190565b92839182610cf6565b03925af1610dff610d11565b50610d2f565b7f4e86ad0da28cbaaaa7e93e36c43b32696e970535225b316f1b84fbf30bdc04e890610a99610a9333610192565b61010090610be8565b61010e906103d0565b610a23610e5b91610e535f90565b506004610284565b90610e65826102b2565b91610e72600182016102c3565b926002820192610e9b610e936004610e8c600387016103fa565b95016102c3565b929594610e3c565b929190565b90610eb9610eaf610554845490565b925f5260205f2090565b905f5b818110610ec95750505090565b909192610ef6610eef600192610ede876102b2565b6001600160a01b0316815260200190565b9460010190565b929101610ebc565b9061010e91610ea0565b906101006103ea92610f1960405190565b93848092610efe565b61010e90610f08565b61010e5f610f22565b610100929190610f4b61083b61083633600161019b565b6111d9565b61010e60a06106a9565b634e487b7160e01b5f525f60045260245ffd5b906001600160a01b03906109cd565b90610f8c61010e6109ee92610192565b8254610f6d565b915f1960089290920291821b911b6109cd565b9190610fb761010e6109ee93610150565b908354610f93565b610100915f91610fa6565b818110610fd5575050565b80610fe25f600193610fbf565b01610fca565b9190601f8111610ff757505050565b611007610100935f5260205f2090565b906020601f840181900483019310611029575b6020601f909101040190610fca565b909150819061101a565b9061103c815190565b9067ffffffffffffffff82116103cb576110608261105a85546102e1565b85610fe8565b602090601f8311600114611099576109ee92915f918361108e575b50505f19600883021c1916906002021790565b015190505f8061107b565b601f198316916110ac855f5260205f2090565b925f5b8181106110e8575091600293918560019694106110d0575b50505002019055565b01515f196008601f8516021c191690555f80806110c7565b919360206001819287870151815501950192016110af565b9061010091611033565b6101009190610a47906080906004906111348161112e87516001600160a01b031690565b90610f7c565b61114660018201610a47602088015190565b61115e60028201611158604088015190565b90611100565b611178600382016111726060880151151590565b906109fb565b0192015190565b919061118e576101009161110a565b610f5a565b90815491680100000000000000008310156103cb57826111bb91600161010095018155610284565b9061117f565b90815260406020820181905261010e92910190610467565b6004546112386004839061123361122c5f6112278161121e8c6112178d611210611201610f50565b6001600160a01b03909c168c52565b60208b0152565b6040890152565b15156060870152565b610150565b6080840152565b611193565b339091929361127961127361126d7f96d64a23b7f23d0f4f8e74c4a7123dab63f617f0ae03ff1006fc101d6b10478b94610192565b94610150565b94610192565b9461128f61128660405190565b928392836111c1565b0390a4565b906101009291610f34565b9081526040810192916101009160200152565b34336112bd30610192565b316112e87fbee4fe3675934fca827426c793623996a3079255089bda3a717019ffc5db276592610192565b926112fe6112f560405190565b9283928361129f565b0390a256fea26469706673582212201380d67cdc21ccb8c507cb6b2f9e3cebab94625ea631118f8286ecf95d3e3e4064736f6c63430008190033
Verified Source Code Full Match
Compiler: v0.8.25+commit.b61c2a91
EVM: cancun
SecureMultiWallet.sol 173 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SecureMultiWallet {
event FundsDeposited(address indexed depositor, uint amount, uint newBalance);
event TransactionSubmitted(
address indexed initiator,
uint indexed txID,
address indexed target,
uint amount,
bytes payload
);
event TransactionConfirmed(address indexed approver, uint indexed txID);
event ConfirmationRevoked(address indexed approver, uint indexed txID);
event TransactionExecuted(address indexed executor, uint indexed txID);
address[] public authorizedUsers;
mapping(address => bool) public isAuthorized;
uint public requiredApprovals;
struct PendingTransaction {
address target;
uint amount;
bytes payload;
bool hasBeenExecuted;
uint approvalCount;
}
// mapping from tx ID => approver => bool
mapping(uint => mapping(address => bool)) public hasConfirmed;
PendingTransaction[] public pendingTransactions;
modifier onlyAuthorized() {
require(isAuthorized[msg.sender], "Unauthorized");
_;
}
modifier transactionExists(uint _txID) {
require(_txID < pendingTransactions.length, "Transaction not found");
_;
}
modifier notYetExecuted(uint _txID) {
require(!pendingTransactions[_txID].hasBeenExecuted, "Transaction already executed");
_;
}
modifier notYetConfirmed(uint _txID) {
require(!hasConfirmed[_txID][msg.sender], "Transaction already approved");
_;
}
constructor(address[] memory _users, uint _requiredApprovals) {
require(_users.length > 0, "Users required");
require(
_requiredApprovals > 0 &&
_requiredApprovals <= _users.length,
"Invalid approval count"
);
for (uint i = 0; i < _users.length; i++) {
address user = _users[i];
require(user != address(0), "Invalid user");
require(!isAuthorized[user], "Duplicate user");
isAuthorized[user] = true;
authorizedUsers.push(user);
}
requiredApprovals = _requiredApprovals;
}
receive() external payable {
emit FundsDeposited(msg.sender, msg.value, address(this).balance);
}
function addTransaction(
address _target,
uint _amount,
bytes memory _payload
) public onlyAuthorized {
uint txID = pendingTransactions.length;
pendingTransactions.push(
PendingTransaction({
target: _target,
amount: _amount,
payload: _payload,
hasBeenExecuted: false,
approvalCount: 0
})
);
emit TransactionSubmitted(msg.sender, txID, _target, _amount, _payload);
}
function approveTransaction(
uint _txID
) public onlyAuthorized transactionExists(_txID) notYetExecuted(_txID) notYetConfirmed(_txID) {
PendingTransaction storage pendingTx = pendingTransactions[_txID];
pendingTx.approvalCount += 1;
hasConfirmed[_txID][msg.sender] = true;
emit TransactionConfirmed(msg.sender, _txID);
}
function runTransaction(
uint _txID
) public onlyAuthorized transactionExists(_txID) notYetExecuted(_txID) {
PendingTransaction storage pendingTx = pendingTransactions[_txID];
require(
pendingTx.approvalCount >= requiredApprovals,
"Insufficient approvals"
);
pendingTx.hasBeenExecuted = true;
(bool success, ) = pendingTx.target.call{value: pendingTx.amount}(
pendingTx.payload
);
require(success, "Transaction execution failed");
emit TransactionExecuted(msg.sender, _txID);
}
function retractApproval(
uint _txID
) public onlyAuthorized transactionExists(_txID) notYetExecuted(_txID) {
PendingTransaction storage pendingTx = pendingTransactions[_txID];
require(hasConfirmed[_txID][msg.sender], "No prior approval found");
pendingTx.approvalCount -= 1;
hasConfirmed[_txID][msg.sender] = false;
emit ConfirmationRevoked(msg.sender, _txID);
}
function listUsers() public view returns (address[] memory) {
return authorizedUsers;
}
function countTransactions() public view returns (uint) {
return pendingTransactions.length;
}
function fetchTransaction(
uint _txID
)
public
view
returns (
address target,
uint amount,
bytes memory payload,
bool hasBeenExecuted,
uint approvalCount
)
{
PendingTransaction storage pendingTx = pendingTransactions[_txID];
return (
pendingTx.target,
pendingTx.amount,
pendingTx.payload,
pendingTx.hasBeenExecuted,
pendingTx.approvalCount
);
}
}
Read Contract
authorizedUsers 0xd8e7d36a → address
countTransactions 0xf81fc230 → uint256
fetchTransaction 0x685067d5 → address, uint256, bytes, bool, uint256
hasConfirmed 0x08aff933 → bool
isAuthorized 0xfe9fbb80 → bool
listUsers 0x8ad257b7 → address[]
pendingTransactions 0x63a8374d → address, uint256, bytes, bool, uint256
requiredApprovals 0x99c1aadc → uint256
Write Contract 4 functions
These functions modify contract state and require a wallet transaction to execute.
addTransaction 0xec096f8d
address _target
uint256 _amount
bytes _payload
approveTransaction 0x242232d1
uint256 _txID
retractApproval 0x3b38e8b0
uint256 _txID
runTransaction 0x5fc89b90
uint256 _txID
Recent Transactions
No transactions found for this address