Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SignMessageLib contract #275

Merged
merged 7 commits into from
Oct 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { TransactionOptions, TransactionResult } from '../types'

export interface SignMessageLibContract {
getAddress(): string
signMessage(data: string, options?: TransactionOptions): Promise<TransactionResult>
getMessageHash(message: string): Promise<string>
encode(methodName: any, params: any): string
estimateGas(methodName: string, params: any[], options: TransactionOptions): Promise<number>
}
1 change: 1 addition & 0 deletions packages/safe-core-sdk-types/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ export * from './contracts/GnosisSafeContract'
export * from './contracts/GnosisSafeProxyFactoryContract'
export * from './contracts/MultiSendCallOnlyContract'
export * from './contracts/MultiSendContract'
export * from './contracts/SignMessageLibContract'
export * from './ethereumLibs/EthAdapter'
export * from './types'
2 changes: 2 additions & 0 deletions packages/safe-ethers-lib/contracts/Deps_V1_3_0.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import { GnosisSafeProxyFactory } from "@gnosis.pm/safe-contracts-v1.3.0/contrac
import { GnosisSafe } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/GnosisSafe.sol";
import { MultiSend } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/libraries/MultiSend.sol";
import { MultiSendCallOnly } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/libraries/MultiSendCallOnly.sol";
import { SignMessageLib } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/examples/libraries/SignMessage.sol";
import { DebugTransactionGuard } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/examples/guards/DebugTransactionGuard.sol";

contract ProxyFactory_SV1_3_0 is GnosisSafeProxyFactory {}
contract GnosisSafe_SV1_3_0 is GnosisSafe {}
contract MultiSend_SV1_3_0 is MultiSend {}
contract MultiSendCallOnly_SV1_3_0 is MultiSendCallOnly {}
contract SignMessageLib_SV1_3_0 is SignMessageLib {}
3 changes: 2 additions & 1 deletion packages/safe-ethers-lib/scripts/generateTypechainFiles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ const safeContracts_V1_3_0 = [
`${safeContractsPath}/v1.3.0/gnosis_safe.json`,
`${safeContractsPath}/v1.3.0/proxy_factory.json`,
`${safeContractsPath}/v1.3.0/multi_send.json`,
`${safeContractsPath}/v1.3.0/multi_send_call_only.json`
`${safeContractsPath}/v1.3.0/multi_send_call_only.json`,
`${safeContractsPath}/v1.3.0/sign_message_lib.json`
].join(' ')
const safeContracts_V1_2_0 = [`${safeContractsPath}/v1.2.0/gnosis_safe.json`].join(' ')
const safeContracts_V1_1_1 = [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { SignMessageLibContract } from '@gnosis.pm/safe-core-sdk-types'
import {
Sign_message_lib as SignMessageLib_V1_3_0,
Sign_message_libInterface as SignMessageLibContractInterface
} from '../../../typechain/src/ethers-v5/v1.3.0/Sign_message_lib'
import { EthersTransactionOptions, EthersTransactionResult } from '../../types'
import { toTxResult } from '../../utils'

abstract class SignMessageLibEthersContract implements SignMessageLibContract {
constructor(public contract: SignMessageLib_V1_3_0) {}

getAddress(): string {
return this.contract.address
}

async signMessage(
data: string,
options?: EthersTransactionOptions
): Promise<EthersTransactionResult> {
if (options && !options.gasLimit) {
options.gasLimit = await this.estimateGas('signMessage', [data], { ...options })
}
const txResponse = await this.contract.signMessage(data, options)
return toTxResult(txResponse, options)
}

async getMessageHash(message: string): Promise<string> {
return this.contract.getMessageHash(message)
}

encode: SignMessageLibContractInterface['encodeFunctionData'] = (
methodName: any,
params: any
): string => {
return this.contract.interface.encodeFunctionData(methodName, params)
}

async estimateGas(
methodName: string,
params: any[],
options: EthersTransactionOptions
): Promise<number> {
return (await (this.contract.estimateGas as any)[methodName](...params, options)).toNumber()
}
}

export default SignMessageLibEthersContract
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Sign_message_lib as SignMessageLib } from '../../../../typechain/src/ethers-v5/v1.3.0/Sign_message_lib'
import SignMessageLibEthersContract from '../SignMessageLibEthersContract'

class SignMessageLibContract_V1_3_0_Ethers extends SignMessageLibEthersContract {
constructor(public contract: SignMessageLib) {
super(contract)
}
}

export default SignMessageLibContract_V1_3_0_Ethers
17 changes: 17 additions & 0 deletions packages/safe-ethers-lib/src/contracts/contractInstancesEthers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Gnosis_safe__factory as SafeMasterCopy_V1_3_0 } from '../../typechain/s
import { Multi_send_call_only__factory as MultiSendCallOnly_V1_3_0 } from '../../typechain/src/ethers-v5/v1.3.0/factories/Multi_send_call_only__factory'
import { Multi_send__factory as MultiSend_V1_3_0 } from '../../typechain/src/ethers-v5/v1.3.0/factories/Multi_send__factory'
import { Proxy_factory__factory as SafeProxyFactory_V1_3_0 } from '../../typechain/src/ethers-v5/v1.3.0/factories/Proxy_factory__factory'
import { Sign_message_lib__factory as SignMessageLib_V1_3_0 } from '../../typechain/src/ethers-v5/v1.3.0/factories/Sign_message_lib__factory'
import GnosisSafeContract_V1_1_1_Ethers from './GnosisSafe/v1.1.1/GnosisSafeContract_V1_1_1_Ethers'
import GnosisSafeContract_V1_2_0_Ethers from './GnosisSafe/v1.2.0/GnosisSafeContract_V1_2_0_Ethers'
import GnosisSafeContract_V1_3_0_Ethers from './GnosisSafe/v1.3.0/GnosisSafeContract_V1_3_0_Ethers'
Expand All @@ -16,6 +17,7 @@ import GnosisSafeProxyFactoryContract_V1_3_0_Ethers from './GnosisSafeProxyFacto
import MultiSendContract_V1_1_1_Ethers from './MultiSend/v1.1.1/MultiSendContract_V1_1_1_Ethers'
import MultiSendContract_V1_3_0_Ethers from './MultiSend/v1.3.0/MultiSendContract_V1_3_0_Ethers'
import MultiSendCallOnlyContract_V1_3_0_Ethers from './MultiSendCallOnly/v1.3.0/MultiSendCallOnlyContract_V1_3_0_Ethers'
import SignMessageLibContract_V1_3_0_Ethers from './SignMessageLib/v1.3.0/SignMessageLibContract_V1_3_0_Ethers'

export function getSafeContractInstance(
safeVersion: SafeVersion,
Expand Down Expand Up @@ -95,3 +97,18 @@ export function getSafeProxyFactoryContractInstance(
throw new Error('Invalid Safe version')
}
}

export function getSignMessageLibContractInstance(
safeVersion: SafeVersion,
contractAddress: string,
signer: Signer
): SignMessageLibContract_V1_3_0_Ethers {
let signMessageLibContract
switch (safeVersion) {
case '1.3.0':
signMessageLibContract = SignMessageLib_V1_3_0.connect(contractAddress, signer)
return new SignMessageLibContract_V1_3_0_Ethers(signMessageLibContract)
default:
throw new Error('Invalid Safe version')
}
}
2 changes: 2 additions & 0 deletions packages/safe-web3-lib/contracts/Deps_V1_3_0.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import { GnosisSafeProxyFactory } from "@gnosis.pm/safe-contracts-v1.3.0/contrac
import { GnosisSafe } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/GnosisSafe.sol";
import { MultiSend } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/libraries/MultiSend.sol";
import { MultiSendCallOnly } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/libraries/MultiSendCallOnly.sol";
import { SignMessageLib } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/examples/libraries/SignMessage.sol";
import { DebugTransactionGuard } from "@gnosis.pm/safe-contracts-v1.3.0/contracts/examples/guards/DebugTransactionGuard.sol";

contract ProxyFactory_SV1_3_0 is GnosisSafeProxyFactory {}
contract GnosisSafe_SV1_3_0 is GnosisSafe {}
contract MultiSend_SV1_3_0 is MultiSend {}
contract MultiSendCallOnly_SV1_3_0 is MultiSendCallOnly {}
contract SignMessageLib_SV1_3_0 is SignMessageLib {}
3 changes: 2 additions & 1 deletion packages/safe-web3-lib/scripts/generateTypechainFiles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ const safeContracts_V1_3_0 = [
`${safeContractsPath}/v1.3.0/gnosis_safe.json`,
`${safeContractsPath}/v1.3.0/proxy_factory.json`,
`${safeContractsPath}/v1.3.0/multi_send.json`,
`${safeContractsPath}/v1.3.0/multi_send_call_only.json`
`${safeContractsPath}/v1.3.0/multi_send_call_only.json`,
`${safeContractsPath}/v1.3.0/sign_message_lib.json`
].join(' ')
const safeContracts_V1_2_0 = [`${safeContractsPath}/v1.2.0/gnosis_safe.json`].join(' ')
const safeContracts_V1_1_1 = [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { SignMessageLibContract } from '@gnosis.pm/safe-core-sdk-types'
import { Sign_message_lib as SignMessageLib_V1_3_0 } from '../../../typechain/src/web3-v1/v1.3.0/Sign_message_lib'
import { Web3TransactionOptions, Web3TransactionResult } from '../../types'
import { toTxResult } from '../../utils'

abstract class SignMessageLibWeb3Contract implements SignMessageLibContract {
constructor(public contract: SignMessageLib_V1_3_0) {}

getAddress(): string {
return this.contract.options.address
}

async signMessage(
data: string,
options?: Web3TransactionOptions
): Promise<Web3TransactionResult> {
if (options && !options.gas) {
options.gas = await this.estimateGas('signMessage', [data], { ...options })
}
const txResponse = this.contract.methods.signMessage(data).send(options)
return toTxResult(txResponse, options)
}

async getMessageHash(message: string): Promise<string> {
return this.contract.methods.getMessageHash(message).call()
}

encode(methodName: string, params: any[]): string {
return (this.contract as any).methods[methodName](...params).encodeABI()
}

async estimateGas(
methodName: string,
params: any[],
options: Web3TransactionOptions
): Promise<number> {
try {
return Number(
await (this.contract.methods as any)[methodName](...params).estimateGas(options)
)
} catch (error) {
return Promise.reject(error)
}
}
}

export default SignMessageLibWeb3Contract
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Sign_message_lib as SignMessageLib } from '../../../../typechain/src/web3-v1/v1.3.0/Sign_message_lib'
import SignMessageLibWeb3Contract from '../SignMessageLibWeb3Contract'

class SignMessageLibContract_V1_3_0_Web3 extends SignMessageLibWeb3Contract {
constructor(public contract: SignMessageLib) {
super(contract)
}
}

export default SignMessageLibContract_V1_3_0_Web3
14 changes: 14 additions & 0 deletions packages/safe-web3-lib/src/contracts/contractInstancesWeb3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { Gnosis_safe as SafeMasterCopy_V1_3_0 } from '../../typechain/src/web3-v
import { Multi_send as MultiSend_V1_3_0 } from '../../typechain/src/web3-v1/v1.3.0/Multi_send'
import { Multi_send_call_only as MultiSendCallOnly_V1_3_0 } from '../../typechain/src/web3-v1/v1.3.0/Multi_send_call_only'
import { Proxy_factory as GnosisSafeProxyFactory_V1_3_0 } from '../../typechain/src/web3-v1/v1.3.0/Proxy_factory'
import { Sign_message_lib as SignMessageLib_V1_3_0 } from '../../typechain/src/web3-v1/v1.3.0/Sign_message_lib'
import GnosisSafeContract_V1_1_1_Web3 from './GnosisSafe/v1.1.1/GnosisSafeContract_V1_1_1_Web3'
import GnosisSafeContract_V1_2_0_Web3 from './GnosisSafe/v1.2.0/GnosisSafeContract_V1_2_0_Web3'
import GnosisSafeContract_V1_3_0_Web3 from './GnosisSafe/v1.3.0/GnosisSafeContract_V1_3_0_Web3'
Expand All @@ -15,6 +16,7 @@ import GnosisSafeProxyFactoryContract_V1_3_0_Web3 from './GnosisSafeProxyFactory
import MultiSendContract_V1_1_1_Web3 from './MultiSend/v1.1.1/MultiSendContract_V1_1_1_Web3'
import MultiSendContract_V1_3_0_Web3 from './MultiSend/v1.3.0/MultiSendContract_V1_3_0_Web3'
import MultiSendCallOnlyContract_V1_3_0_Web3 from './MultiSendCallOnly/v1.3.0/MultiSendCallOnlyContract_V1_3_0_Web3'
import SignMessageLibContract_V1_3_0_Web3 from './SignMessageLib/v1.3.0/SignMessageLibContract_V1_3_0_Web3'

export function getSafeContractInstance(
safeVersion: SafeVersion,
Expand Down Expand Up @@ -84,3 +86,15 @@ export function getGnosisSafeProxyFactoryContractInstance(
throw new Error('Invalid Safe version')
}
}

export function getSignMessageLibContractInstance(
safeVersion: SafeVersion,
signMessageLibContract: SignMessageLib_V1_3_0
): SignMessageLibContract_V1_3_0_Web3 {
switch (safeVersion) {
case '1.3.0':
return new SignMessageLibContract_V1_3_0_Web3(signMessageLibContract as SignMessageLib_V1_3_0)
default:
throw new Error('Invalid Safe version')
}
}