Gnosis safe多签交易可以到官网去在线构造,但有时候不想在官网进行操作,或者为了规避官网的故障,可以自己在本地构造交易脚本,直接去多签合约交互,以达到多签钱包交易的目的。
首先要明确的是多签钱包实际是一个智能合约,里面存储了owner地址,多签达标门槛数等信息,当要触发某个交易时,比较简单的实现方式可以是每个owner都发出一笔交易,直到达到达标数量后,在最后一笔交易时去触发实际的多签钱包交易,但这种方式会多消耗owner钱包的gas费,而且也不那么优雅。Gnosis safe用了EIP712的方式,owner先签名交易,当达到达标门槛后,再把签名拼接在一起,执行一次交易在合约里验证签名去触发实际交易。
const domain = {
chainId: process.env.CHAIN_ID,//链ID
verifyingContract: process.env.VERIFY_CONTRACT//多签合约地址
};
const types = {
SafeTx: [
{ type: "address", name: "to" },
{ type: "uint256", name: "value" },
{ type: "bytes", name: "data" },
{ type: "uint8", name: "operation" },
{ type: "uint256", name: "safeTxGas" },
{ type: "uint256", name: "baseGas" },
{ type: "uint256", name: "gasPrice" },
{ type: "address", name: "gasToken" },
{ type: "address", name: "refundReceiver" },
{ type: "uint256", name: "nonce" },
]
}
let nonce=await provider.call({
to: process.env.VERIFY_CONTRACT,
data: ethers.utils.keccak256(ethers.utils.toUtf8Bytes("nonce()")).slice(0,10)
});//获取多签钱包的nonce值,防止重放攻击
//The data to sign
const value = {
to:"",//实际交易的to地址
value:,//实际交易的value值
data:"",//实际交易的data
operation:0,
safeTxGas:0,
baseGas:0,
gasPrice:0,
gasToken:"0x0000000000000000000000000000000000000000",
refundReceiver:"0x0000000000000000000000000000000000000000",
nonce:ethers.BigNumber.from(nonce).toNumber()
};
//假设owner的钱包是w1,w2,w3,以下对交易进行签名
let signature1 = await w1._signTypedData(domain, types, value);
let signature2 = await w2._signTypedData(domain, types, value);
let signature3 = await w3._signTypedData(domain, types, value);
const sig=signature1+signature2.slice(2)+signature3.slice(2);//要按钱包地址从小到大的顺序拼接地址生成的签名串,这里假设w1<w2<w3
const data=ethers.utils.defaultAbiCoder.encode([ "address", "uint256","bytes","uint8", "uint256", "uint256", "uint256" ,"address","address","bytes"],
[ value.to,value.value,value.data,value.operation,value.safeTxGas,value.baseGas,value.gasPrice,value.gasToken,value.refundReceiver,sig]);//构造execTransaction参数串
let tran={
to:process.env.VERIFY_CONTRACT,
data:"0x6a761202"+data.slice(2)
};
//用任意钱包地址对tran发出交易即可
Gnosis safe多签交易可以到官网去在线构造,但有时候不想在官网进行操作,或者为了规避官网的故障,可以自己在本地构造交易脚本,直接去多签合约交互,以达到多签钱包交易的目的。
首先要明确的是多签钱包实际是一个智能合约,里面存储了owner地址,多签达标门槛数等信息,当要触发某个交易时,比较简单的实现方式可以是每个owner都发出一笔交易,直到达到达标数量后,在最后一笔交易时去触发实际的多签钱包交易,但这种方式会多消耗owner钱包的gas费,而且也不那么优雅。Gnosis safe用了EIP712的方式,owner先签名交易,当达到达标门槛后,再把签名拼接在一起,执行一次交易在合约里验证签名去触发实际交易。
const domain = {
chainId: process.env.CHAIN_ID,//链ID
verifyingContract: process.env.VERIFY_CONTRACT//多签合约地址
};
const types = {
SafeTx: [
{ type: "address", name: "to" },
{ type: "uint256", name: "value" },
{ type: "bytes", name: "data" },
{ type: "uint8", name: "operation" },
{ type: "uint256", name: "safeTxGas" },
{ type: "uint256", name: "baseGas" },
{ type: "uint256", name: "gasPrice" },
{ type: "address", name: "gasToken" },
{ type: "address", name: "refundReceiver" },
{ type: "uint256", name: "nonce" },
]
}
let nonce=await provider.call({
to: process.env.VERIFY_CONTRACT,
data: ethers.utils.keccak256(ethers.utils.toUtf8Bytes("nonce()")).slice(0,10)
});//获取多签钱包的nonce值,防止重放攻击
//The data to sign
const value = {
to:"",//实际交易的to地址
value:,//实际交易的value值
data:"",//实际交易的data
operation:0,
safeTxGas:0,
baseGas:0,
gasPrice:0,
gasToken:"0x0000000000000000000000000000000000000000",
refundReceiver:"0x0000000000000000000000000000000000000000",
nonce:ethers.BigNumber.from(nonce).toNumber()
};
//假设owner的钱包是w1,w2,w3,以下对交易进行签名
let signature1 = await w1._signTypedData(domain, types, value);
let signature2 = await w2._signTypedData(domain, types, value);
let signature3 = await w3._signTypedData(domain, types, value);
const sig=signature1+signature2.slice(2)+signature3.slice(2);//要按钱包地址从小到大的顺序拼接地址生成的签名串,这里假设w1<w2<w3
const data=ethers.utils.defaultAbiCoder.encode([ "address", "uint256","bytes","uint8", "uint256", "uint256", "uint256" ,"address","address","bytes"],
[ value.to,value.value,value.data,value.operation,value.safeTxGas,value.baseGas,value.gasPrice,value.gasToken,value.refundReceiver,sig]);//构造execTransaction参数串
let tran={
to:process.env.VERIFY_CONTRACT,
data:"0x6a761202"+data.slice(2)
};
//用任意钱包地址对tran发出交易即可
搭建BSC Fullnode
要运行BSC全节点,首先需要有服务器,币安官方推荐服务器配置VPS running recent versions of Mac OS X or Linux.IMPORTANT 2T GB of free disk space, solid-state drive(SSD), gp3, 8k IOPS, 250MB/S throughput, read latency <1ms. (if start with snap/fast sync, it will need NVMe SSD)16 cores of CPU and 64 gigabytes of memory (RAM).Suggest m5zn.3xlarge instance type on AWS, c2-standard-16 on Google cloud.A broadband Internet connection with upload/download speeds of 5 megabyte per second我是在aliyun买的VPS,配置是16核64G,系统盘40G,数据盘3000G ESSD...
以Synthetix为例,MEV策略剖析
本文翻译自Robert Miller的Anatomy of an MEV Strategy: Synthetix 几个月前臭名昭著的alpha泄露者KALEB在Flashbots公开的searchers频道发表了下列消息KALBE泄露了关于Synthetix变动的数千万美金的alpha消息。在这个机器人运营商的小房间里分享alpha就像丢给狮子一块红肉一样,在快速看了合约之后可以确认有笔另人晕眩的钱处在危机中。 在接下来的几周,我计划并且尝试去执行策略来捕获KALEB分享的MEV。我会开源我用的代码并一步一步展示整个过程和策略。你将不能运行我的代码去赚钱,但是这篇文章将会教你我是如何设计这个新的搜索者并会包含许多alpha。很自然的,这将会有点技术性,但我会尽量让本文对于非技术读者来说好理解。第一步,识别机会我不是一个Synthetix专家,因此第一步是去学习我将要涉及的操作。具体如下:我找出了相关合约我在Synthetix博客里读了它们的高级别功能并且搜索了相关文档我确保理解了将要实行的治理变动我查找了相关函数总结一下这阶段的工作,Synthetix已经试验了以ETH为抵押去铸...
Bitmap结构在ENSToken里的应用
在ENSToken的合约里看到了Bitmaps的应用,在地址认领空投时用了Merkle树证明来check用户地址和认领数量,进而会对应一个Merkle的index,为了防止重复认领空投,合约里用了OpenZeppelin的Bitmaps库来做位图存储,地址认领成功后,就将对应的index在位图里存true,下次如果再来认领就会判断这个位图,如果为true时就返回错误,以此来防止重复认领空投。BitMaps.BitMap private claimed; /** * @dev Claims airdropped tokens. * @param amount The amount of the claim being made. * @param delegate The address the tokenholder wants to delegate their votes to. * @param merkleProof A merkle proof proving the claim is valid. */ function claimTokens(uint256 amo...
搭建BSC Fullnode
要运行BSC全节点,首先需要有服务器,币安官方推荐服务器配置VPS running recent versions of Mac OS X or Linux.IMPORTANT 2T GB of free disk space, solid-state drive(SSD), gp3, 8k IOPS, 250MB/S throughput, read latency <1ms. (if start with snap/fast sync, it will need NVMe SSD)16 cores of CPU and 64 gigabytes of memory (RAM).Suggest m5zn.3xlarge instance type on AWS, c2-standard-16 on Google cloud.A broadband Internet connection with upload/download speeds of 5 megabyte per second我是在aliyun买的VPS,配置是16核64G,系统盘40G,数据盘3000G ESSD...
以Synthetix为例,MEV策略剖析
本文翻译自Robert Miller的Anatomy of an MEV Strategy: Synthetix 几个月前臭名昭著的alpha泄露者KALEB在Flashbots公开的searchers频道发表了下列消息KALBE泄露了关于Synthetix变动的数千万美金的alpha消息。在这个机器人运营商的小房间里分享alpha就像丢给狮子一块红肉一样,在快速看了合约之后可以确认有笔另人晕眩的钱处在危机中。 在接下来的几周,我计划并且尝试去执行策略来捕获KALEB分享的MEV。我会开源我用的代码并一步一步展示整个过程和策略。你将不能运行我的代码去赚钱,但是这篇文章将会教你我是如何设计这个新的搜索者并会包含许多alpha。很自然的,这将会有点技术性,但我会尽量让本文对于非技术读者来说好理解。第一步,识别机会我不是一个Synthetix专家,因此第一步是去学习我将要涉及的操作。具体如下:我找出了相关合约我在Synthetix博客里读了它们的高级别功能并且搜索了相关文档我确保理解了将要实行的治理变动我查找了相关函数总结一下这阶段的工作,Synthetix已经试验了以ETH为抵押去铸...
Bitmap结构在ENSToken里的应用
在ENSToken的合约里看到了Bitmaps的应用,在地址认领空投时用了Merkle树证明来check用户地址和认领数量,进而会对应一个Merkle的index,为了防止重复认领空投,合约里用了OpenZeppelin的Bitmaps库来做位图存储,地址认领成功后,就将对应的index在位图里存true,下次如果再来认领就会判断这个位图,如果为true时就返回错误,以此来防止重复认领空投。BitMaps.BitMap private claimed; /** * @dev Claims airdropped tokens. * @param amount The amount of the claim being made. * @param delegate The address the tokenholder wants to delegate their votes to. * @param merkleProof A merkle proof proving the claim is valid. */ function claimTokens(uint256 amo...
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
No comments yet