合约地址 https://sepolia.etherscan.io/address/0x3496A4572432674333CcF2c57c3bFe4c37711249#code
合约接口
1 多签注册合约
interface IERCSignerManage { struct Signer { address[] Signers; uint threshold; } event CreateSigner(address[] Signer, uint threshold,address sender, uint256 indexed userId); event AddSigner(address Signer,address sender); event RemoveSigner(address Signer,address sender); //设置多签账号 function setSigners(address[] memory Signer, uint threshold,uint256 userId) external; function setSignersWithOwner(address[] memory Signer,address owner, uint threshold,uint256 userId) external; }
合约abi
[ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "Signer", "type": "address" }, { "indexed": false, "internalType": "address", "name": "sender", "type": "address" } ], "name": "AddSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address[]", "name": "Signer", "type": "address[]" }, { "indexed": false, "internalType": "uint256", "name": "threshold", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "userId", "type": "uint256" }, { "indexed": false, "internalType": "string[]", "name": "names", "type": "string[]" } ], "name": "CreateOwnSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address[]", "name": "Signer", "type": "address[]" }, { "indexed": false, "internalType": "uint256", "name": "threshold", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "userId", "type": "uint256" }, { "indexed": false, "internalType": "string[]", "name": "names", "type": "string[]" } ], "name": "CreateSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "Signer", "type": "address" }, { "indexed": false, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RemoveSigner", "type": "event" }, { "inputs": [ { "internalType": "address[]", "name": "Signer", "type": "address[]" }, { "internalType": "string[]", "name": "names", "type": "string[]" }, { "internalType": "uint256", "name": "threshold", "type": "uint256" }, { "internalType": "uint256", "name": "userId", "type": "uint256" } ], "name": "setSigners", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "Signer", "type": "address[]" }, { "internalType": "string[]", "name": "names", "type": "string[]" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "threshold", "type": "uint256" }, { "internalType": "uint256", "name": "userId", "type": "uint256" } ], "name": "setSignersWithOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
2.多签交易合约
interface IERCMulSigner { event CreateMulSigner(address sender, uint txHash, uint txId); event ForceOverMulSigner(address sender, uint txHash); event ApproveMulSigner(address sender, uint txHash, uint txId); event StartMulSigner(address sender, uint txHash, uint txId); event RejectMulSigner(uint txHash, uint txId); event ExecuteMulSigner(uint txHash, uint txId); enum SignerOp { Approve, Reject } //创建多签 function createMulSignerTx( uint amount, uint when, address to, string memory blank, MulTx.TxType txType, uint txId ) external payable; function createMulSignerTxWithSiger( uint amount, uint when, address to, string memory blank, MulTx.TxType txType, uint txId, address owner ) external payable; //结束多签 function forceOverMulSigner(uint txHash) external; // 提交签名 function submitMulSigner(uint txHash, IERCMulSigner.SignerOp op) external; //审核多签 function startMulSigner(uint txHash) external; }
合约abi
[ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "txHash", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "txId", "type": "uint256" } ], "name": "ApproveMulSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "txHash", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "txId", "type": "uint256" } ], "name": "CreateMulSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "txHash", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "txId", "type": "uint256" } ], "name": "ExecuteMulSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "txHash", "type": "uint256" } ], "name": "ForceOverMulSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "txHash", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "txId", "type": "uint256" } ], "name": "RejectMulSigner", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "txHash", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "txId", "type": "uint256" } ], "name": "StartMulSigner", "type": "event" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "when", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "string", "name": "blank", "type": "string" }, { "internalType": "enum MulTx.TxType", "name": "txType", "type": "uint8" }, { "internalType": "uint256", "name": "txId", "type": "uint256" } ], "name": "createMulSignerTx", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "when", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "string", "name": "blank", "type": "string" }, { "internalType": "enum MulTx.TxType", "name": "txType", "type": "uint8" }, { "internalType": "uint256", "name": "txId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "createMulSignerTxWithSiger", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "txHash", "type": "uint256" } ], "name": "forceOverMulSigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "txHash", "type": "uint256" } ], "name": "startMulSigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "txHash", "type": "uint256" }, { "internalType": "enum IERCMulSigner.SignerOp", "name": "op", "type": "uint8" } ], "name": "submitMulSigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
3. 多签交易结构体
/** *@dev 交易结构体 * 根据TxType的不同,交易结构体的字段不同 * 1.法币提现交易, blank字段为银行卡号,amount为提现金额,to 暂时没用,from为发起地址 * 2.数字货币提现交易, blank字段是提取代币名称例如"MATIC","USDT",amount为提现金额,to 提取账户地址,from为发起地址 blank字段为银行卡号 * 3.添加签名人交易, blank字段没用,amount为0,to 新增的签名人地址,from为发起地址 * 4. 删除签名人交易, blank字段没用,amount为0,to 被删除的签名人地址,from为发起地址 * 5. 限额交易, blank字段没用,amount为限额,to 暂时没用,from为发起地址 * 6. 业务配置交易变更, blank字段没用,amount为业务配置的value,to 暂时没用,from为发起地址: value的编码,为 按位进行 如果是两项就表示,每一位代表一个业务 10/00/11/01 1表示开启 0表示关闭 * 另外 业务配置 目前 有两个配置项 1.法币提现 2.加密提现 */ struct Mtx{ string blank; uint txId; uint amount; uint when; address to; address from; uint index; TxType txType; uint txHash; }
4 。多签业务类型
enum TxType{ FiatWithDraw, //法币提取 0 CryptoWithDraw, // 加密货币提取 1 AddSigner, //增加签名人 2 RemoveSigner, //移除签名人3 LimitQuota, //配额 4 BizConfigChange //业务配置变更 5 }
5. 签名 操作值
0 同意 1拒绝