Commit d4de0cf3 authored by Matthew Slipper's avatar Matthew Slipper Committed by GitHub

Merge pull request #2321 from mslipper/feat/teleportr-kovan

go/teleportr contracts: Updates to support deploying Teleportr to Kovan
parents defdeffd 7150efbb
...@@ -142,15 +142,15 @@ func NewConfig(ctx *cli.Context) (Config, error) { ...@@ -142,15 +142,15 @@ func NewConfig(ctx *cli.Context) (Config, error) {
return Config{ return Config{
Hostname: ctx.GlobalString(flags.APIHostnameFlag.Name), Hostname: ctx.GlobalString(flags.APIHostnameFlag.Name),
Port: uint16(ctx.GlobalUint64(flags.APIPortFlag.Name)), Port: uint16(ctx.GlobalUint64(flags.APIPortFlag.Name)),
L1EthRpc: ctx.GlobalString(flags.APIL1EthRpcFlag.Name), L1EthRpc: ctx.GlobalString(flags.L1EthRpcFlag.Name),
DepositAddress: ctx.GlobalString(flags.APIDepositAddressFlag.Name), DepositAddress: ctx.GlobalString(flags.DepositAddressFlag.Name),
NumConfirmations: ctx.GlobalUint64(flags.APINumConfirmationsFlag.Name), NumConfirmations: ctx.GlobalUint64(flags.NumDepositConfirmationsFlag.Name),
PostgresHost: ctx.GlobalString(flags.APIPostgresHostFlag.Name), PostgresHost: ctx.GlobalString(flags.PostgresHostFlag.Name),
PostgresPort: uint16(ctx.GlobalUint64(flags.APIPostgresPortFlag.Name)), PostgresPort: uint16(ctx.GlobalUint64(flags.PostgresPortFlag.Name)),
PostgresUser: ctx.GlobalString(flags.APIPostgresUserFlag.Name), PostgresUser: ctx.GlobalString(flags.PostgresUserFlag.Name),
PostgresPassword: ctx.GlobalString(flags.APIPostgresPasswordFlag.Name), PostgresPassword: ctx.GlobalString(flags.PostgresPasswordFlag.Name),
PostgresDBName: ctx.GlobalString(flags.APIPostgresDBNameFlag.Name), PostgresDBName: ctx.GlobalString(flags.PostgresDBNameFlag.Name),
PostgresEnableSSL: ctx.GlobalBool(flags.APIPostgresEnableSSLFlag.Name), PostgresEnableSSL: ctx.GlobalBool(flags.PostgresEnableSSLFlag.Name),
}, nil }, nil
} }
......
...@@ -33,6 +33,13 @@ func main() { ...@@ -33,6 +33,13 @@ func main() {
app.Name = "teleportr" app.Name = "teleportr"
app.Usage = "Teleportr" app.Usage = "Teleportr"
app.Description = "Teleportr bridge from L1 to L2" app.Description = "Teleportr bridge from L1 to L2"
app.Commands = []cli.Command{
{
Name: "migrate",
Usage: "Migrates teleportr's database",
Action: teleportr.Migrate(),
},
}
app.Action = teleportr.Main(GitVersion) app.Action = teleportr.Main(GitVersion)
err := app.Run(os.Args) err := app.Run(os.Args)
......
...@@ -390,7 +390,8 @@ dep.txn_hash, dep.block_number, dep.block_timestamp, ...@@ -390,7 +390,8 @@ dep.txn_hash, dep.block_number, dep.block_timestamp,
dis.txn_hash, dis.block_number, dis.block_timestamp dis.txn_hash, dis.block_number, dis.block_timestamp
FROM deposits AS dep FROM deposits AS dep
LEFT JOIN disbursements AS dis LEFT JOIN disbursements AS dis
ON dep.id = dis.id AND dep.txn_hash = $1 ON dep.id = dis.id
WHERE dep.txn_hash = $1
LIMIT 1 LIMIT 1
` `
...@@ -416,7 +417,8 @@ dep.txn_hash, dep.block_number, dep.block_timestamp, ...@@ -416,7 +417,8 @@ dep.txn_hash, dep.block_number, dep.block_timestamp,
dis.txn_hash, dis.block_number, dis.block_timestamp dis.txn_hash, dis.block_number, dis.block_timestamp
FROM deposits AS dep FROM deposits AS dep
LEFT JOIN disbursements AS dis LEFT JOIN disbursements AS dis
ON dep.id = dis.id AND dep.address = $1 ON dep.id = dis.id
WHERE dep.address = $1
ORDER BY dep.block_timestamp DESC, dep.id DESC ORDER BY dep.block_timestamp DESC, dep.id DESC
LIMIT 100 LIMIT 100
` `
......
...@@ -234,6 +234,7 @@ func (d *Driver) CraftBatchTx( ...@@ -234,6 +234,7 @@ func (d *Driver) CraftBatchTx(
var disbursements []disburse.TeleportrDisburserDisbursement var disbursements []disburse.TeleportrDisburserDisbursement
var depositIDs []uint64 var depositIDs []uint64
value := new(big.Int)
for _, deposit := range confirmedDeposits { for _, deposit := range confirmedDeposits {
disbursement := disburse.TeleportrDisburserDisbursement{ disbursement := disburse.TeleportrDisburserDisbursement{
Amount: deposit.Amount, Amount: deposit.Amount,
...@@ -241,6 +242,7 @@ func (d *Driver) CraftBatchTx( ...@@ -241,6 +242,7 @@ func (d *Driver) CraftBatchTx(
} }
disbursements = append(disbursements, disbursement) disbursements = append(disbursements, disbursement)
depositIDs = append(depositIDs, deposit.ID) depositIDs = append(depositIDs, deposit.ID)
value = value.Add(value, deposit.Amount)
} }
log.Info(name+" crafting batch tx", "start", start, "end", end, log.Info(name+" crafting batch tx", "start", start, "end", end,
...@@ -250,7 +252,7 @@ func (d *Driver) CraftBatchTx( ...@@ -250,7 +252,7 @@ func (d *Driver) CraftBatchTx(
log.Info(name+" batch constructed", "num_disbursements", len(disbursements)) log.Info(name+" batch constructed", "num_disbursements", len(disbursements))
gasPrice, err := d.cfg.L1Client.SuggestGasPrice(ctx) gasPrice, err := d.cfg.L2Client.SuggestGasPrice(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -265,6 +267,7 @@ func (d *Driver) CraftBatchTx( ...@@ -265,6 +267,7 @@ func (d *Driver) CraftBatchTx(
opts.Nonce = nonce opts.Nonce = nonce
opts.GasPrice = gasPrice opts.GasPrice = gasPrice
opts.NoSend = true opts.NoSend = true
opts.Value = value
tx, err := d.disburserContract.Disburse(opts, start, disbursements) tx, err := d.disburserContract.Disburse(opts, start, disbursements)
if err != nil { if err != nil {
...@@ -299,6 +302,7 @@ func (d *Driver) UpdateGasPrice( ...@@ -299,6 +302,7 @@ func (d *Driver) UpdateGasPrice(
opts.Context = ctx opts.Context = ctx
opts.Nonce = new(big.Int).SetUint64(tx.Nonce()) opts.Nonce = new(big.Int).SetUint64(tx.Nonce())
opts.GasPrice = gasPrice opts.GasPrice = gasPrice
opts.Value = tx.Value()
opts.NoSend = true opts.NoSend = true
return d.rawDisburserContract.RawTransact(opts, tx.Data()) return d.rawDisburserContract.RawTransact(opts, tx.Data())
...@@ -313,7 +317,7 @@ func (d *Driver) SendTransaction( ...@@ -313,7 +317,7 @@ func (d *Driver) SendTransaction(
txHash := tx.Hash() txHash := tx.Hash()
startID := d.currentDepositIDs[0] startID := d.currentDepositIDs[0]
endID := d.currentDepositIDs[len(d.currentDepositIDs)] + 1 endID := d.currentDepositIDs[len(d.currentDepositIDs) - 1] + 1
// Record the pending transaction hash so that we can recover if we crash // Record the pending transaction hash so that we can recover if we crash
// after publishing. // after publishing.
......
...@@ -24,74 +24,18 @@ var ( ...@@ -24,74 +24,18 @@ var (
Required: true, Required: true,
EnvVar: prefixAPIEnvVar("PORT"), EnvVar: prefixAPIEnvVar("PORT"),
} }
APIL1EthRpcFlag = cli.StringFlag{
Name: "l1-eth-rpc",
Usage: "The endpoint for the L1 ETH provider",
Required: true,
EnvVar: prefixAPIEnvVar("L1_ETH_RPC"),
}
APIDepositAddressFlag = cli.StringFlag{
Name: "deposit-address",
Usage: "Address of the TeleportrDeposit contract",
Required: true,
EnvVar: prefixAPIEnvVar("DEPOSIT_ADDRESS"),
}
APINumConfirmationsFlag = cli.StringFlag{
Name: "num-confirmations",
Usage: "Number of confirmations required until deposits are " +
"considered confirmed",
Required: true,
EnvVar: prefixAPIEnvVar("NUM_CONFIRMATIONS"),
}
APIPostgresHostFlag = cli.StringFlag{
Name: "postgres-host",
Usage: "Host of the teleportr postgres instance",
Required: true,
EnvVar: prefixAPIEnvVar("POSTGRES_HOST"),
}
APIPostgresPortFlag = cli.Uint64Flag{
Name: "postgres-port",
Usage: "Port of the teleportr postgres instance",
Required: true,
EnvVar: prefixAPIEnvVar("POSTGRES_PORT"),
}
APIPostgresUserFlag = cli.StringFlag{
Name: "postgres-user",
Usage: "Username of the teleportr postgres instance",
Required: true,
EnvVar: prefixAPIEnvVar("POSTGRES_USER"),
}
APIPostgresPasswordFlag = cli.StringFlag{
Name: "postgres-password",
Usage: "Password of the teleportr postgres instance",
Required: true,
EnvVar: prefixAPIEnvVar("POSTGRES_PASSWORD"),
}
APIPostgresDBNameFlag = cli.StringFlag{
Name: "postgres-db-name",
Usage: "Database name of the teleportr postgres instance",
Required: true,
EnvVar: prefixAPIEnvVar("POSTGRES_DB_NAME"),
}
APIPostgresEnableSSLFlag = cli.BoolFlag{
Name: "postgres-enable-ssl",
Usage: "Whether or not to enable SSL on connections to " +
"teleportr postgres instance",
Required: true,
EnvVar: prefixAPIEnvVar("POSTGRES_ENABLE_SSL"),
}
) )
var APIFlags = []cli.Flag{ var APIFlags = []cli.Flag{
APIHostnameFlag, APIHostnameFlag,
APIPortFlag, APIPortFlag,
APIL1EthRpcFlag, L1EthRpcFlag,
APIDepositAddressFlag, DepositAddressFlag,
APINumConfirmationsFlag, NumDepositConfirmationsFlag,
APIPostgresHostFlag, PostgresHostFlag,
APIPostgresPortFlag, PostgresPortFlag,
APIPostgresUserFlag, PostgresUserFlag,
APIPostgresPasswordFlag, PostgresPasswordFlag,
APIPostgresDBNameFlag, PostgresDBNameFlag,
APIPostgresEnableSSLFlag, PostgresEnableSSLFlag,
} }
...@@ -126,16 +126,15 @@ var ( ...@@ -126,16 +126,15 @@ var (
Required: true, Required: true,
EnvVar: prefixEnvVar("POSTGRES_DB_NAME"), EnvVar: prefixEnvVar("POSTGRES_DB_NAME"),
} }
/* Optional Flags */
PostgresEnableSSLFlag = cli.BoolFlag{ PostgresEnableSSLFlag = cli.BoolFlag{
Name: "postgres-enable-ssl", Name: "postgres-enable-ssl",
Usage: "Whether or not to enable SSL on connections to " + Usage: "Whether or not to enable SSL on connections to " +
"teleportr postgres instance", "teleportr postgres instance",
Required: true,
EnvVar: prefixEnvVar("POSTGRES_ENABLE_SSL"), EnvVar: prefixEnvVar("POSTGRES_ENABLE_SSL"),
} }
/* Optional Flags */
LogLevelFlag = cli.StringFlag{ LogLevelFlag = cli.StringFlag{
Name: "log-level", Name: "log-level",
Usage: "The lowest log level that will be output", Usage: "The lowest log level that will be output",
...@@ -208,12 +207,12 @@ var requiredFlags = []cli.Flag{ ...@@ -208,12 +207,12 @@ var requiredFlags = []cli.Flag{
PostgresUserFlag, PostgresUserFlag,
PostgresPasswordFlag, PostgresPasswordFlag,
PostgresDBNameFlag, PostgresDBNameFlag,
PostgresEnableSSLFlag,
} }
var optionalFlags = []cli.Flag{ var optionalFlags = []cli.Flag{
LogLevelFlag, LogLevelFlag,
LogTerminalFlag, LogTerminalFlag,
PostgresEnableSSLFlag,
DisburserPrivateKeyFlag, DisburserPrivateKeyFlag,
MnemonicFlag, MnemonicFlag,
DisburserHDPathFlag, DisburserHDPathFlag,
......
...@@ -85,7 +85,7 @@ func Main(gitVersion string) func(ctx *cli.Context) error { ...@@ -85,7 +85,7 @@ func Main(gitVersion string) func(ctx *cli.Context) error {
go metrics.RunServer(cfg.MetricsHostname, cfg.MetricsPort) go metrics.RunServer(cfg.MetricsHostname, cfg.MetricsPort)
} }
chainID, err := l1Client.ChainID(ctx) chainID, err := l2Client.ChainID(ctx)
if err != nil { if err != nil {
return err return err
} }
...@@ -120,7 +120,7 @@ func Main(gitVersion string) func(ctx *cli.Context) error { ...@@ -120,7 +120,7 @@ func Main(gitVersion string) func(ctx *cli.Context) error {
Driver: teleportrDriver, Driver: teleportrDriver,
PollInterval: cfg.PollInterval, PollInterval: cfg.PollInterval,
ClearPendingTx: false, ClearPendingTx: false,
L1Client: l1Client, L1Client: l2Client,
TxManagerConfig: txManagerConfig, TxManagerConfig: txManagerConfig,
}) })
...@@ -152,3 +152,33 @@ func Main(gitVersion string) func(ctx *cli.Context) error { ...@@ -152,3 +152,33 @@ func Main(gitVersion string) func(ctx *cli.Context) error {
return nil return nil
} }
} }
func Migrate() func(ctx *cli.Context) error {
return func(cliCtx *cli.Context) error {
cfg, err := NewConfig(cliCtx)
if err != nil {
return err
}
log.Info("Initializing teleportr")
database, err := db.Open(db.Config{
Host: cfg.PostgresHost,
Port: uint16(cfg.PostgresPort),
User: cfg.PostgresUser,
Password: cfg.PostgresPassword,
DBName: cfg.PostgresDBName,
EnableSSL: cfg.PostgresEnableSSL,
})
if err != nil {
return err
}
log.Info("Migrating database")
if err := database.Migrate(); err != nil {
return err
}
log.Info("Done")
return nil
}
}
\ No newline at end of file
FROM golang:1.17.3-alpine3.13 as builder
RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash
COPY ./go/bss-core /go/bss-core
COPY ./go/teleportr/go.mod ./go/teleportr/go.sum /go/teleportr/
WORKDIR /go/teleportr
RUN go mod graph | grep -v bss-core | awk '{if ($1 !~ "@") print $2}' | xargs -n 1 go get
COPY ./go/teleportr/ ./
RUN make teleportr teleportr-api
FROM alpine:3.13
RUN apk add --no-cache ca-certificates jq curl
COPY --from=builder /go/teleportr/teleportr /usr/local/bin/
COPY --from=builder /go/teleportr/teleportr-api /usr/local/bin/
CMD ["teleportr"]
This diff is collapsed.
...@@ -23,6 +23,7 @@ dotenv.config() ...@@ -23,6 +23,7 @@ dotenv.config()
const enableGasReport = !!process.env.ENABLE_GAS_REPORT const enableGasReport = !!process.env.ENABLE_GAS_REPORT
const privateKey = process.env.PRIVATE_KEY || '0x' + '11'.repeat(32) // this is to avoid hardhat error const privateKey = process.env.PRIVATE_KEY || '0x' + '11'.repeat(32) // this is to avoid hardhat error
const deploy = process.env.DEPLOY_DIRECTORY || 'deploy'
const config: HardhatUserConfig = { const config: HardhatUserConfig = {
networks: { networks: {
...@@ -40,11 +41,13 @@ const config: HardhatUserConfig = { ...@@ -40,11 +41,13 @@ const config: HardhatUserConfig = {
'optimism-kovan': { 'optimism-kovan': {
chainId: 69, chainId: 69,
url: 'https://kovan.optimism.io', url: 'https://kovan.optimism.io',
deploy,
accounts: [privateKey], accounts: [privateKey],
}, },
'optimism-mainnet': { 'optimism-mainnet': {
chainId: 10, chainId: 10,
url: 'https://mainnet.optimism.io', url: 'https://mainnet.optimism.io',
deploy,
accounts: [privateKey], accounts: [privateKey],
}, },
'mainnet-trial': { 'mainnet-trial': {
...@@ -52,6 +55,18 @@ const config: HardhatUserConfig = { ...@@ -52,6 +55,18 @@ const config: HardhatUserConfig = {
url: 'http://127.0.0.1:8545', url: 'http://127.0.0.1:8545',
accounts: [privateKey], accounts: [privateKey],
}, },
kovan: {
chainId: 42,
url: process.env.CONTRACTS_RPC_URL || '',
deploy,
accounts: [privateKey],
},
mainnet: {
chainId: 1,
url: process.env.CONTRACTS_RPC_URL || '',
deploy,
accounts: [privateKey],
},
}, },
mocha: { mocha: {
timeout: 50000, timeout: 50000,
......
/* Imports: External */
import { ethers } from 'ethers'
import { task } from 'hardhat/config'
import * as types from 'hardhat/internal/core/params/argumentTypes'
task('deploy-teleportr-l1')
.addParam(
'minDepositAmountEth',
'Minimum deposit amount, in ETH.',
undefined,
types.string
)
.addParam(
'maxDepositAmountEth',
'Maximum deposit amount, in ETH.',
undefined,
types.string
)
.addParam(
'maxBalanceEth',
'Maximum contract balance, in ETH.',
undefined,
types.string
)
.addOptionalParam(
'numDeployConfirmations',
'Number of confirmations to wait for each transaction in the deployment. More is safer.',
1,
types.int
)
.setAction(
async (
{
minDepositAmountEth,
maxDepositAmountEth,
maxBalanceEth,
numDeployConfirmations,
},
hre: any
) => {
const { deploy } = hre.deployments
const { deployer } = await hre.getNamedAccounts()
console.log('Deploying TeleportrDeposit... ')
await deploy('TeleportrDeposit', {
from: deployer,
args: [
ethers.utils.parseEther(minDepositAmountEth),
ethers.utils.parseEther(maxDepositAmountEth),
ethers.utils.parseEther(maxBalanceEth),
],
log: true,
waitConfirmations: numDeployConfirmations,
})
console.log('Done.')
}
)
task('deploy-teleportr-l2').setAction(
async ({ numDeployConfirmations }, hre: any) => {
const { deploy } = hre.deployments
const { deployer } = await hre.getNamedAccounts()
console.log('Deploying TeleportrDisburser... ')
await deploy('TeleportrDisburser', {
from: deployer,
args: [],
log: true,
waitConfirmations: numDeployConfirmations,
})
console.log('Done.')
}
)
...@@ -6,3 +6,4 @@ export * from './validate-chugsplash-dictator' ...@@ -6,3 +6,4 @@ export * from './validate-chugsplash-dictator'
export * from './whitelist' export * from './whitelist'
export * from './withdraw-fees' export * from './withdraw-fees'
export * from './fetch-batches' export * from './fetch-batches'
export * from './deploy-teleportr'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment