WA-238 Creating Safe Master Copy once
This commit is contained in:
parent
2cd55379ee
commit
068b08eb82
|
@ -5,14 +5,9 @@ import { connect } from 'react-redux'
|
||||||
import Page from '~/components/layout/Page'
|
import Page from '~/components/layout/Page'
|
||||||
import { getAccountsFrom, getThresholdFrom, getNamesFrom, getSafeNameFrom, getDailyLimitFrom } from '~/routes/open/utils/safeDataExtractor'
|
import { getAccountsFrom, getThresholdFrom, getNamesFrom, getSafeNameFrom, getDailyLimitFrom } from '~/routes/open/utils/safeDataExtractor'
|
||||||
import { getWeb3 } from '~/wallets/getWeb3'
|
import { getWeb3 } from '~/wallets/getWeb3'
|
||||||
import {
|
import { getGnosisSafeContract, deploySafeContract, initContracts } from '~/wallets/safeContracts'
|
||||||
getCreateAddExtensionContract,
|
|
||||||
getCreateDailyLimitExtensionContract,
|
|
||||||
getCreateProxyFactoryContract,
|
|
||||||
getGnosisSafeContract,
|
|
||||||
} from '~/wallets/safeContracts'
|
|
||||||
import selector from './selector'
|
import selector from './selector'
|
||||||
import actions, { type Actions } from './actions'
|
import actions, { type Actions, type AddSafe } from './actions'
|
||||||
import Layout from '../components/Layout'
|
import Layout from '../components/Layout'
|
||||||
|
|
||||||
type Props = Actions & {
|
type Props = Actions & {
|
||||||
|
@ -25,7 +20,7 @@ type State = {
|
||||||
safeTx: string,
|
safeTx: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
const createSafe = async (values, userAccount, addSafe): State => {
|
const createSafe = async (values: Object, userAccount: string, addSafe: AddSafe): Promise<State> => {
|
||||||
const accounts = getAccountsFrom(values)
|
const accounts = getAccountsFrom(values)
|
||||||
const numConfirmations = getThresholdFrom(values)
|
const numConfirmations = getThresholdFrom(values)
|
||||||
const name = getSafeNameFrom(values)
|
const name = getSafeNameFrom(values)
|
||||||
|
@ -34,28 +29,9 @@ const createSafe = async (values, userAccount, addSafe): State => {
|
||||||
|
|
||||||
const web3 = getWeb3()
|
const web3 = getWeb3()
|
||||||
const GnosisSafe = getGnosisSafeContract(web3)
|
const GnosisSafe = getGnosisSafeContract(web3)
|
||||||
const ProxyFactory = getCreateProxyFactoryContract(web3)
|
|
||||||
const CreateAndAddExtension = getCreateAddExtensionContract(web3)
|
|
||||||
const DailyLimitExtension = getCreateDailyLimitExtensionContract(web3)
|
|
||||||
|
|
||||||
// Create Master Copies
|
await initContracts()
|
||||||
const proxyFactory = await ProxyFactory.new({ from: userAccount, gas: '5000000' })
|
const safe = await deploySafeContract(accounts, numConfirmations, userAccount)
|
||||||
const createAndAddExtension = await CreateAndAddExtension.new({ from: userAccount, gas: '5000000' })
|
|
||||||
|
|
||||||
// Initialize safe master copy
|
|
||||||
const gnosisSafeMasterCopy = await GnosisSafe.new({ from: userAccount, gas: '5000000' })
|
|
||||||
gnosisSafeMasterCopy.setup([userAccount], 1, 0, 0, { from: userAccount, gas: '5000000' })
|
|
||||||
|
|
||||||
// Initialize extension master copy
|
|
||||||
const dailyLimitExtensionMasterCopy = await DailyLimitExtension.new({ from: userAccount, gas: '5000000' })
|
|
||||||
dailyLimitExtensionMasterCopy.setup([], [], { from: userAccount, gas: '5000000' })
|
|
||||||
|
|
||||||
// Create Gnosis Safe and Daily Limit Extension in one transactions
|
|
||||||
const extensionData = await dailyLimitExtensionMasterCopy.contract.setup.getData([0], [100], { from: userAccount, gas: '5000000' })
|
|
||||||
const proxyFactoryData = await proxyFactory.contract.createProxy.getData(dailyLimitExtensionMasterCopy.address, extensionData, { from: userAccount, gas: '5000000' })
|
|
||||||
const createAndAddExtensionData = createAndAddExtension.contract.createAndAddExtension.getData(proxyFactory.address, proxyFactoryData, { from: userAccount, gas: '5000000' })
|
|
||||||
const gnosisSafeData = await gnosisSafeMasterCopy.contract.setup.getData(accounts, numConfirmations, createAndAddExtension.address, createAndAddExtensionData, { from: userAccount, gas: '5000000' })
|
|
||||||
const safe = await proxyFactory.createProxy(gnosisSafeMasterCopy.address, gnosisSafeData, { from: userAccount, gas: '5000000' })
|
|
||||||
|
|
||||||
const param = safe.logs[1].args.proxy
|
const param = safe.logs[1].args.proxy
|
||||||
const safeContract = GnosisSafe.at(param)
|
const safeContract = GnosisSafe.at(param)
|
||||||
|
|
|
@ -1,11 +1,18 @@
|
||||||
// @flow
|
// @flow
|
||||||
import contract from 'truffle-contract'
|
import contract from 'truffle-contract'
|
||||||
|
import { promisify } from '~/utils/promisify'
|
||||||
import { ensureOnce } from '~/utils/singleton'
|
import { ensureOnce } from '~/utils/singleton'
|
||||||
|
import { getWeb3 } from '~/wallets/getWeb3'
|
||||||
import GnosisSafeSol from '#/GnosisSafe.json'
|
import GnosisSafeSol from '#/GnosisSafe.json'
|
||||||
import ProxyFactorySol from '#/ProxyFactory.json'
|
import ProxyFactorySol from '#/ProxyFactory.json'
|
||||||
import CreateAndAddExtensionSol from '#/CreateAndAddExtension.json'
|
import CreateAndAddExtensionSol from '#/CreateAndAddExtension.json'
|
||||||
import DailyLimitExtensionSol from '#/DailyLimitExtension.json'
|
import DailyLimitExtensionSol from '#/DailyLimitExtension.json'
|
||||||
|
|
||||||
|
let proxyFactoryMaster
|
||||||
|
let createAndAddExtensionMaster
|
||||||
|
let safeMaster
|
||||||
|
let dailyLimitMaster
|
||||||
|
|
||||||
const createGnosisSafeContract = (web3: any) => {
|
const createGnosisSafeContract = (web3: any) => {
|
||||||
const gnosisSafe = contract(GnosisSafeSol)
|
const gnosisSafe = contract(GnosisSafeSol)
|
||||||
gnosisSafe.setProvider(web3.currentProvider)
|
gnosisSafe.setProvider(web3.currentProvider)
|
||||||
|
@ -35,6 +42,47 @@ const createDailyLimitExtensionContract = (web3: any) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getGnosisSafeContract = ensureOnce(createGnosisSafeContract)
|
export const getGnosisSafeContract = ensureOnce(createGnosisSafeContract)
|
||||||
export const getCreateProxyFactoryContract = ensureOnce(createProxyFactoryContract)
|
const getCreateProxyFactoryContract = ensureOnce(createProxyFactoryContract)
|
||||||
export const getCreateAddExtensionContract = ensureOnce(createAddExtensionContract)
|
const getCreateAddExtensionContract = ensureOnce(createAddExtensionContract)
|
||||||
export const getCreateDailyLimitExtensionContract = ensureOnce(createDailyLimitExtensionContract)
|
const getCreateDailyLimitExtensionContract = ensureOnce(createDailyLimitExtensionContract)
|
||||||
|
|
||||||
|
const createMasterCopies = async () => {
|
||||||
|
const web3 = getWeb3()
|
||||||
|
const accounts = await promisify(cb => web3.eth.getAccounts(cb))
|
||||||
|
const userAccount = accounts[0]
|
||||||
|
const ProxyFactory = getCreateProxyFactoryContract(web3)
|
||||||
|
const CreateAndAddExtension = getCreateAddExtensionContract(web3)
|
||||||
|
const DailyLimitExtension = getCreateDailyLimitExtensionContract(web3)
|
||||||
|
|
||||||
|
// Create Master Copies
|
||||||
|
proxyFactoryMaster = await ProxyFactory.new({ from: userAccount, gas: '5000000' })
|
||||||
|
createAndAddExtensionMaster = await CreateAndAddExtension.new({ from: userAccount, gas: '5000000' })
|
||||||
|
|
||||||
|
// Initialize safe master copy
|
||||||
|
const GnosisSafe = getGnosisSafeContract(web3)
|
||||||
|
safeMaster = await GnosisSafe.new({ from: userAccount, gas: '5000000' })
|
||||||
|
safeMaster.setup([userAccount], 1, 0, 0, { from: userAccount, gas: '5000000' })
|
||||||
|
|
||||||
|
// Initialize extension master copy
|
||||||
|
dailyLimitMaster = await DailyLimitExtension.new({ from: userAccount, gas: '5000000' })
|
||||||
|
dailyLimitMaster.setup([], [], { from: userAccount, gas: '5000000' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export const initContracts = ensureOnce(createMasterCopies)
|
||||||
|
|
||||||
|
const getSafeDataBasedOn = async (accounts, numConfirmations) => {
|
||||||
|
const extensionData = await dailyLimitMaster.contract.setup
|
||||||
|
.getData([0], [100])
|
||||||
|
const proxyFactoryData = await proxyFactoryMaster.contract.createProxy
|
||||||
|
.getData(dailyLimitMaster.address, extensionData)
|
||||||
|
const createAndAddExtensionData = createAndAddExtensionMaster.contract.createAndAddExtension
|
||||||
|
.getData(proxyFactoryMaster.address, proxyFactoryData)
|
||||||
|
|
||||||
|
return safeMaster.contract.setup
|
||||||
|
.getData(accounts, numConfirmations, createAndAddExtensionMaster.address, createAndAddExtensionData)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const deploySafeContract = async (safeAccounts: string[], numConfirmations: number, userAccount: string) => {
|
||||||
|
const gnosisSafeData = await getSafeDataBasedOn(safeAccounts, numConfirmations)
|
||||||
|
return proxyFactoryMaster.createProxy(safeMaster.address, gnosisSafeData, { from: userAccount, gas: '5000000' })
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue