2.1 多簽錢包

更新 發佈閱讀 9 分鐘

address public owners:

uint public numConfirmationsRequired


event transactionsubmitted

event TransactionConfirmed

event transactionExecuted


constructor


for loop


function submitTransaction

function confirmTransaction

function executeTransaction

function isTransactionConfirmed

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

contract MultiSig {
address[] public owners; // the people who control this smart contract
uint public numConfirmationsRequired; // how many people voted for this tx


struct Transaction{
address to; // the address of the person we care sending ether to
uint value; // the amount of value we will be sending
bool executed; // whether the transaction is success or not
}
// neseted mapping
mapping(uint=>mapping(address=>bool)) isConfirmed;
Transaction[] public transactions;

event TransactionSubmitted(uint transactionId,address sender, address receiver, uint amount);
event TransactionConfirmed(uint transactionId);
event TransactionExecuted(uint transactionId);
constructor(address[] memory _owners,uint _numConfirmationsRequired){ // the person who sign this tx
require(_owners.length>1, "Owners Required[Must Be Greater than 1"); // owners should be greater than 1 person
require(_numConfirmationsRequired>0 && numConfirmationsRequired<=_owners.length,"Num of confirmation are not in sync with the number of owners"); // make sure the voted person qty is align with

for(uint i=0;i<_owners.length;i++){
require(_owners[i]!=address(0), "Invalid Owner");
owners.push(_owners[i]);
}
numConfirmationsRequired=_numConfirmationsRequired;
}

function submitTransaction(address _to) public payable {
require(_to!=address(0),"Invalid Receiver's Address");
require(msg.value>0,"Transfer Amount Must Be Greater Than 0");
uint transactionId = transactions.length;
transactions.push(Transaction({to:_to,value:msg.value,executed:false}));
emit TransactionSubmitted(transactionId,msg.sender,_to,msg.value);
}

function confirmTransaction(uint _transactionId) public{
require(_transactionId<transactions.length, "Invalid Transaction Id");
require(!isConfirmed[_transactionId][msg.sender], "Transaction Is Already Confirmed By The Owner");
isConfirmed[_transactionId][msg.sender]=true;
emit TransactionConfirmed(_transactionId);
if(isTransactionConfirmed(_transactionId)){
executeTransaction(_transactionId);
}
}

function executeTransaction(uint _transactionId) public payable{
require(_transactionId<transactions.length, "Invalid Transaction Id");
require(!transactions[_transactionId].executed,"Transaction is already executed");
// transaction[_transactionId].executed=true;
(bool success,)=transactions[_transactionId].to.call{value: transactions[_transactionId].value}("")
require(success,"Transaction Execution Failed");
emit TransactionExecuted(_transactionId);
}

function isTransactionConfirmed(uint _transactionId) public view returns(bool){
require(_transactionId<transactions.length, "Invalid Transaction Id");
uint confirmationCount;//initially zero

for(uint i=0; i<owners.length;i++){
if(isConfirmed[_transactionId][owners[i]]){
confirmationCount++;
}
}
return confirmationCount>=numConfirmationsRequired;
}
}



[Reference]

  1. Building a Multisignature Wallet using Solidity | Code Eater - Blockchain | English, Code Eater Web3, May 10, 2023
  2. What is Multisig Technology? The Federalist Society, Jun 28, 2017
  3. What is a multi-sig wallet?, Technest, Mar 12, 2021
  4. Memo Notepad
  5. explore 5fire network dashboard


留言
avatar-img
留言分享你的想法!
avatar-img
Follow the Rainmaker 🌧️
5會員
91內容數
尋大神腳印, 亦步亦趨。
2024/06/12
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
2024/06/12
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
2024/05/29
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
2024/05/29
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
2024/05/28
在 Solidity 中,constant 變量用於定義不可變的常數值。這些常數在合約的生命週期內不會改變,並且它們的值必須在宣告時設定。使用 constant 關鍵字可以節省 gas,因為它們在編譯時就已經被嵌入到字節碼中,不需要在運行時讀取存儲。 用法 定義常數: 常數變量必須在宣告時初始
2024/05/28
在 Solidity 中,constant 變量用於定義不可變的常數值。這些常數在合約的生命週期內不會改變,並且它們的值必須在宣告時設定。使用 constant 關鍵字可以節省 gas,因為它們在編譯時就已經被嵌入到字節碼中,不需要在運行時讀取存儲。 用法 定義常數: 常數變量必須在宣告時初始
看更多