Skip to content

Commit 4278b8b

Browse files
committed
deploy testnet and mainnet contracts
1 parent 56b14df commit 4278b8b

29 files changed

Lines changed: 397 additions & 177 deletions

client/asset/eth/deploy.go

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import (
1313
"decred.org/dcrdex/client/asset"
1414
"decred.org/dcrdex/dex"
1515
erc20v0 "decred.org/dcrdex/dex/networks/erc20/contracts/v0"
16+
erc20v1 "decred.org/dcrdex/dex/networks/erc20/contracts/v1"
1617
dexeth "decred.org/dcrdex/dex/networks/eth"
1718
multibal "decred.org/dcrdex/dex/networks/eth/contracts/multibalance"
1819
ethv0 "decred.org/dcrdex/dex/networks/eth/contracts/v0"
20+
ethv1 "decred.org/dcrdex/dex/networks/eth/contracts/v1"
1921
"github.com/ethereum/go-ethereum"
2022
"github.com/ethereum/go-ethereum/accounts/abi"
2123
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -140,37 +142,35 @@ func (contractDeployer) EstimateMultiBalanceDeployFunding(
140142
}
141143

142144
func (contractDeployer) txData(contractVer uint32, tokenAddr common.Address) (txData []byte, err error) {
143-
var abi *abi.ABI
144-
var bytecode []byte
145-
isToken := tokenAddr != (common.Address{})
146-
if isToken {
147-
switch contractVer {
148-
case 0:
149-
bytecode = common.FromHex(erc20v0.ERC20SwapBin)
150-
abi, err = erc20v0.ERC20SwapMetaData.GetAbi()
151-
}
152-
} else {
145+
if tokenAddr == (common.Address{}) {
153146
switch contractVer {
154147
case 0:
155-
bytecode = common.FromHex(ethv0.ETHSwapBin)
156-
abi, err = ethv0.ETHSwapMetaData.GetAbi()
148+
return common.FromHex(ethv0.ETHSwapBin), nil
149+
case 1:
150+
return common.FromHex(ethv1.ETHSwapBin), nil
157151
}
158152
}
153+
var abi *abi.ABI
154+
var bytecode []byte
155+
switch contractVer {
156+
case 0:
157+
bytecode = common.FromHex(erc20v0.ERC20SwapBin)
158+
abi, err = erc20v0.ERC20SwapMetaData.GetAbi()
159+
case 1:
160+
bytecode = common.FromHex(erc20v1.ERC20SwapBin)
161+
abi, err = erc20v1.ERC20SwapMetaData.GetAbi()
162+
}
159163
if err != nil {
160164
return nil, fmt.Errorf("error parsing ABI: %w", err)
161165
}
162166
if abi == nil {
163167
return nil, fmt.Errorf("no abi data for version %d", contractVer)
164168
}
165-
txData = bytecode
166-
if isToken {
167-
argData, err := abi.Pack("", tokenAddr)
168-
if err != nil {
169-
return nil, fmt.Errorf("error packing token address: %w", err)
170-
}
171-
txData = append(txData, argData...)
169+
argData, err := abi.Pack("", tokenAddr)
170+
if err != nil {
171+
return nil, fmt.Errorf("error packing token address: %w", err)
172172
}
173-
return
173+
return append(bytecode, argData...), nil
174174
}
175175

176176
// DeployContract deployes a dcrdex swap contract.
@@ -199,6 +199,11 @@ func (contractDeployer) DeployContract(
199199
contractAddr, tx, _, err := erc20v0.DeployERC20Swap(txOpts, cb, tokenAddress)
200200
return contractAddr, tx, err
201201
}
202+
case 1:
203+
deployer = func(txOpts *bind.TransactOpts, cb bind.ContractBackend) (common.Address, *types.Transaction, error) {
204+
contractAddr, tx, _, err := erc20v1.DeployERC20Swap(txOpts, cb, tokenAddress)
205+
return contractAddr, tx, err
206+
}
202207

203208
}
204209
} else {
@@ -208,6 +213,11 @@ func (contractDeployer) DeployContract(
208213
contractAddr, tx, _, err := ethv0.DeployETHSwap(txOpts, cb)
209214
return contractAddr, tx, err
210215
}
216+
case 1:
217+
deployer = func(txOpts *bind.TransactOpts, cb bind.ContractBackend) (common.Address, *types.Transaction, error) {
218+
contractAddr, tx, _, err := ethv1.DeployETHSwap(txOpts, cb)
219+
return contractAddr, tx, err
220+
}
211221
}
212222
}
213223
if deployer == nil {
@@ -264,7 +274,7 @@ func (contractDeployer) deployContract(
264274
}
265275

266276
feeRate := dexeth.WeiToGweiCeil(maxFeeRate)
267-
log.Infof("Estimated fees: %s gwei / gas", ui.ConventionalString(feeRate*gas))
277+
log.Infof("Estimated fees: %s gwei", ui.ConventionalString(feeRate*gas))
268278

269279
gas *= 5 / 4 // Add 20% buffer
270280
feesWithBuffer := feeRate * gas
@@ -287,7 +297,13 @@ func (contractDeployer) deployContract(
287297
return err
288298
}
289299

290-
log.Infof("👍 Contract %s launched with tx %s", contractAddr, tx.Hash())
300+
log.Infof("Contract %s launched with tx %s", contractAddr, tx.Hash())
301+
302+
if err = waitForConfirmation(ctx, cl, tx.Hash()); err != nil {
303+
return fmt.Errorf("error waiting for deployment transaction status: %w", err)
304+
}
305+
306+
log.Info("👍 Transaction confirmed")
291307

292308
return nil
293309
}

client/asset/eth/eth.go

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,8 @@ func (w *ETHWallet) Connect(ctx context.Context) (_ *sync.WaitGroup, err error)
879879
for ver, constructor := range contractorConstructors {
880880
contractAddr, exists := w.versionedContracts[ver]
881881
if !exists || contractAddr == (common.Address{}) {
882-
return nil, fmt.Errorf("no contract address for version %d, net %s", ver, w.net)
882+
w.log.Debugf("no eth swap contract address for version %d, net %s", ver, w.net)
883+
continue
883884
}
884885
c, err := constructor(w.net, contractAddr, w.addr, w.node.contractBackend())
885886
if err != nil {
@@ -5580,9 +5581,26 @@ func (getGas) ReadCredentials(chain, credentialsPath string, net dex.Network) (a
55805581
return
55815582
}
55825583

5583-
func getGetGasClientWithEstimatesAndBalances(ctx context.Context, net dex.Network, assetID, contractVer uint32, maxSwaps int,
5584-
walletDir string, providers []string, seed []byte, wParams *GetGasWalletParams, log dex.Logger) (cl *multiRPCClient, c contractor,
5585-
ethReq, swapReq, feeRate uint64, ethBal, tokenBal *big.Int, err error) {
5584+
func getGetGasClientWithEstimatesAndBalances(
5585+
ctx context.Context,
5586+
net dex.Network,
5587+
contractVer uint32,
5588+
maxSwaps int,
5589+
walletDir string,
5590+
providers []string,
5591+
seed []byte,
5592+
wParams *GetGasWalletParams,
5593+
log dex.Logger,
5594+
) (
5595+
cl *multiRPCClient,
5596+
c contractor,
5597+
ethReq,
5598+
swapReq,
5599+
feeRate uint64,
5600+
ethBal,
5601+
tokenBal *big.Int,
5602+
err error,
5603+
) {
55865604

55875605
cl, c, err = quickNode(ctx, walletDir, contractVer, seed, providers, wParams, net, log)
55885606
if err != nil {
@@ -5666,7 +5684,7 @@ func (getGas) EstimateFunding(ctx context.Context, net dex.Network, assetID, con
56665684
}
56675685
defer os.RemoveAll(walletDir)
56685686

5669-
cl, _, ethReq, swapReq, _, ethBalBig, tokenBalBig, err := getGetGasClientWithEstimatesAndBalances(ctx, net, assetID, contractVer, maxSwaps, walletDir, providers, seed, wParams, log)
5687+
cl, _, ethReq, swapReq, _, ethBalBig, tokenBalBig, err := getGetGasClientWithEstimatesAndBalances(ctx, net, contractVer, maxSwaps, walletDir, providers, seed, wParams, log)
56705688
if err != nil {
56715689
return err
56725690
}
@@ -5833,6 +5851,7 @@ func (getGas) returnFunds(
58335851
}
58345852

58355853
remainder := ethBal - fees
5854+
58365855
txOpts, err := cl.txOpts(ctx, remainder, defaultSendGasLimit, maxFeeRate, tipRate, nil)
58375856
if err != nil {
58385857
return fmt.Errorf("error generating tx opts: %w", err)
@@ -5857,6 +5876,10 @@ func (getGas) returnFunds(
58575876
func (getGas) Estimate(ctx context.Context, net dex.Network, assetID, contractVer uint32, maxSwaps int,
58585877
credentialsPath string, wParams *GetGasWalletParams, log dex.Logger) error {
58595878

5879+
if *wParams.Gas == (dexeth.Gases{}) {
5880+
return fmt.Errorf("empty gas table. put some estimates in VersionedGases or Tokens for this contract")
5881+
}
5882+
58605883
symbol := dex.BipIDSymbol(assetID)
58615884
log.Infof("Getting gas estimates for up to %d swaps of asset %s, contract version %d on %s", maxSwaps, symbol, contractVer, symbol)
58625885

@@ -5873,7 +5896,7 @@ func (getGas) Estimate(ctx context.Context, net dex.Network, assetID, contractVe
58735896
}
58745897
defer os.RemoveAll(walletDir)
58755898

5876-
cl, c, ethReq, swapReq, feeRate, ethBal, tokenBal, err := getGetGasClientWithEstimatesAndBalances(ctx, net, assetID, contractVer, maxSwaps, walletDir, providers, seed, wParams, log)
5899+
cl, c, ethReq, swapReq, feeRate, ethBal, tokenBal, err := getGetGasClientWithEstimatesAndBalances(ctx, net, contractVer, maxSwaps, walletDir, providers, seed, wParams, log)
58775900
if err != nil {
58785901
return err
58795902
}
@@ -5998,6 +6021,8 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
59986021
return fmt.Errorf("error getting network fees: %v", err)
59996022
}
60006023

6024+
maxFeeRate := new(big.Int).Add(tipRate, new(big.Int).Mul(baseRate, big.NewInt(2)))
6025+
60016026
defer func() {
60026027
if len(stats.swaps) == 0 {
60036028
return
@@ -6038,17 +6063,23 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
60386063
fmt.Printf(" %+v \n", stats.transfers)
60396064
}()
60406065

6066+
logTx := func(tag string, n int, tx *types.Transaction) {
6067+
log.Infof("%s %d tx, hash = %s, nonce = %d, maxFeeRate = %s, tip cap = %s",
6068+
tag, n, tx.Hash(), tx.Nonce(), tx.GasFeeCap(), tx.GasTipCap())
6069+
}
6070+
60416071
// Estimate approve for tokens.
60426072
if isToken {
60436073
sendApprove := func(cl ethFetcher, c tokenContractor) error {
6044-
txOpts, err := cl.txOpts(ctx, 0, g.Approve*2, baseRate, tipRate, nil)
6074+
txOpts, err := cl.txOpts(ctx, 0, g.Approve*2, maxFeeRate, tipRate, nil)
60456075
if err != nil {
60466076
return fmt.Errorf("error constructing signed tx opts for approve: %w", err)
60476077
}
60486078
tx, err := c.approve(txOpts, unlimitedAllowance)
60496079
if err != nil {
60506080
return fmt.Errorf("error estimating approve gas: %w", err)
60516081
}
6082+
logTx("Approve", 1, tx)
60526083
if err = waitForConfirmation(ctx, cl, tx.Hash()); err != nil {
60536084
return fmt.Errorf("error waiting for approve transaction: %w", err)
60546085
}
@@ -6075,7 +6106,7 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
60756106
return fmt.Errorf("error sending approve transaction for the initiator: %w", err)
60766107
}
60776108

6078-
txOpts, err := cl.txOpts(ctx, 0, g.Transfer*2, baseRate, tipRate, nil)
6109+
txOpts, err := cl.txOpts(ctx, 0, g.Transfer*2, maxFeeRate, tipRate, nil)
60796110
if err != nil {
60806111
return fmt.Errorf("error constructing signed tx opts for transfer: %w", err)
60816112
}
@@ -6088,6 +6119,7 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
60886119
if err != nil {
60896120
return fmt.Errorf("transfer error: %w", err)
60906121
}
6122+
logTx("Transfer", 1, transferTx)
60916123
if err = waitForConfirmation(ctx, cl, transferTx.Hash()); err != nil {
60926124
return fmt.Errorf("error waiting for transfer tx: %w", err)
60936125
}
@@ -6127,7 +6159,7 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
61276159
}
61286160

61296161
// Send the inits
6130-
txOpts, err := cl.txOpts(ctx, optsVal, g.SwapN(n)*2, baseRate, tipRate, nil)
6162+
txOpts, err := cl.txOpts(ctx, optsVal, g.SwapN(n)*2, maxFeeRate, tipRate, nil)
61316163
if err != nil {
61326164
return fmt.Errorf("error constructing signed tx opts for %d swaps: %v", n, err)
61336165
}
@@ -6136,6 +6168,7 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
61366168
if err != nil {
61376169
return fmt.Errorf("initiate error for %d swaps: %v", n, err)
61386170
}
6171+
logTx("Initiate", n, tx)
61396172
if err = waitForConfirmation(ctx, cl, tx.Hash()); err != nil {
61406173
return fmt.Errorf("error waiting for init tx to be mined: %w", err)
61416174
}
@@ -6170,7 +6203,7 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
61706203
})
61716204
}
61726205

6173-
txOpts, err = cl.txOpts(ctx, 0, g.RedeemN(n)*2, baseRate, tipRate, nil)
6206+
txOpts, err = cl.txOpts(ctx, 0, g.RedeemN(n)*2, maxFeeRate, tipRate, nil)
61746207
if err != nil {
61756208
return fmt.Errorf("error constructing signed tx opts for %d redeems: %v", n, err)
61766209
}
@@ -6179,6 +6212,7 @@ func getGasEstimates(ctx context.Context, cl, acl ethFetcher, c contractor, ac t
61796212
if err != nil {
61806213
return fmt.Errorf("redeem error for %d swaps: %v", n, err)
61816214
}
6215+
logTx("Redeem", n, tx)
61826216
if err = waitForConfirmation(ctx, cl, tx.Hash()); err != nil {
61836217
return fmt.Errorf("error waiting for redeem tx to be mined: %w", err)
61846218
}

client/asset/polygon/polygon.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ var (
7474
WalletInfo = asset.WalletInfo{
7575
Name: "Polygon",
7676
Version: 0,
77-
SupportedVersions: []uint32{0},
77+
SupportedVersions: []uint32{0, 1},
7878
UnitInfo: dexpolygon.UnitInfo,
7979
AvailableWallets: []*asset.WalletDefinition{
8080
{

dex/networks/erc20/contracts/updatecontract.sh

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,6 @@ fi
3636
mkdir temp
3737

3838
solc --abi --bin --bin-runtime --overwrite --optimize ${SOLIDITY_FILE} -o ./temp/
39-
BYTECODE=$(<./temp/${CONTRACT_NAME}.bin-runtime)
40-
41-
cat > "./${PKG_NAME}/BinRuntimeV${VERSION}.go" <<EOF
42-
// Code generated - DO NOT EDIT.
43-
// This file is a generated binding and any manual changes will be lost.
44-
45-
package ${PKG_NAME}
46-
47-
const ${CONTRACT_NAME}RuntimeBin = "${BYTECODE}"
48-
EOF
4939

5040
CONTRACT_FILE=./${PKG_NAME}/contract.go
5141
abigen --abi ./temp/${CONTRACT_NAME}.abi --bin ./temp/${CONTRACT_NAME}.bin \
@@ -56,15 +46,8 @@ BYTECODE=$(<./temp/${CONTRACT_NAME}.bin)
5646
solc --bin --optimize ${TEST_TOKEN} -o ./temp
5747
TEST_TOKEN_BYTECODE=$(<./temp/TestToken.bin)
5848

59-
for HARNESS_PATH in "$(realpath ../../../testing/eth/harness.sh)" "$(realpath ../../../testing/polygon/harness.sh)"; do
60-
sed -i.tmp "s/ERC20_SWAP_V${VERSION}=.*/ERC20_SWAP_V${VERSION}=\"${BYTECODE}\"/" "${HARNESS_PATH}"
61-
# mac needs a temp file specified above.
62-
rm "${HARNESS_PATH}.tmp"
63-
64-
sed -i.tmp "s/TEST_TOKEN=.*/TEST_TOKEN=\"${TEST_TOKEN_BYTECODE}\"/" "${HARNESS_PATH}"
65-
# mac needs a temp file specified above.
66-
rm "${HARNESS_PATH}.tmp"
67-
done
49+
echo "${BYTECODE}" | xxd -r -p > "v${VERSION}/swap_contract.bin"
50+
echo "${TEST_TOKEN_BYTECODE}" | xxd -r -p > "v${VERSION}/token_contract.bin"
6851

6952
rm -fr temp
7053

dex/networks/erc20/contracts/v0/BinRuntimeV0.go

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)