Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
cd8c1025
Commit
cd8c1025
authored
Dec 21, 2021
by
hezhengjun
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'withdraw_opt_1217' of github.com:zhengjunhe/plugin into withdraw_opt_1217
parents
3a2f95b6
0dfc5b84
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
134 additions
and
44 deletions
+134
-44
createERC20.go
plugin/dapp/cross2eth/boss4x/chain33/offline/createERC20.go
+34
-0
offline.go
plugin/dapp/cross2eth/boss4x/chain33/offline/offline.go
+1
-0
Chain33BridgeBank.abi
plugin/dapp/cross2eth/cmd/build/abi/Chain33BridgeBank.abi
+2
-2
docker-compose-cross2eth.yml
plugin/dapp/cross2eth/cmd/build/docker-compose-cross2eth.yml
+5
-0
mainPubilcRelayerTest.sh
.../dapp/cross2eth/cmd/build/public/mainPubilcRelayerTest.sh
+7
-20
ethereum.go
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethereum.go
+79
-17
contracts_test.go
...s2eth/ebrelayer/relayer/ethereum/ethtxs/contracts_test.go
+5
-5
types.go
...dapp/cross2eth/ebrelayer/relayer/ethereum/ethtxs/types.go
+1
-0
No files found.
plugin/dapp/cross2eth/boss4x/chain33/offline/createERC20.go
View file @
cd8c1025
...
...
@@ -210,3 +210,37 @@ func CreateNewBridgeToken(cmd *cobra.Command, _ []string) {
}
callContractAndSignWrite
(
cmd
,
packData
,
contract
,
"create_bridge_token"
)
}
func
SetWithdrawProxyCmd
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
Use
:
"set_withdraw_proxy"
,
Short
:
"set withdraw proxy on chain33, and it's should be done by operator"
,
Run
:
SetWithdrawProxy
,
}
addSetWithdrawProxyFlags
(
cmd
)
return
cmd
}
func
addSetWithdrawProxyFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"address"
,
"a"
,
""
,
"withdraw address"
)
_
=
cmd
.
MarkFlagRequired
(
"address"
)
cmd
.
Flags
()
.
StringP
(
"contract"
,
"c"
,
""
,
"bridgebank contract address"
)
_
=
cmd
.
MarkFlagRequired
(
"contract"
)
cmd
.
Flags
()
.
StringP
(
"key"
,
"k"
,
""
,
"the deployer private key"
)
_
=
cmd
.
MarkFlagRequired
(
"key"
)
cmd
.
Flags
()
.
StringP
(
"note"
,
"n"
,
""
,
"transaction note info (optional)"
)
cmd
.
Flags
()
.
Float64P
(
"fee"
,
"f"
,
0
,
"contract gas fee (optional)"
)
}
func
SetWithdrawProxy
(
cmd
*
cobra
.
Command
,
_
[]
string
)
{
contract
,
_
:=
cmd
.
Flags
()
.
GetString
(
"contract"
)
withdrawAddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"address"
)
parameter
:=
fmt
.
Sprintf
(
"setWithdrawProxy(%s)"
,
withdrawAddr
)
_
,
packData
,
err
:=
evmAbi
.
Pack
(
parameter
,
generated
.
BridgeBankABI
,
false
)
if
nil
!=
err
{
fmt
.
Println
(
"configOfflineSaveAccount"
,
"Failed to do abi.Pack due to:"
,
err
.
Error
())
return
}
callContractAndSignWrite
(
cmd
,
packData
,
contract
,
"create_bridge_token"
)
}
plugin/dapp/cross2eth/boss4x/chain33/offline/offline.go
View file @
cd8c1025
...
...
@@ -35,6 +35,7 @@ func Boss4xOfflineCmd() *cobra.Command {
ConfigLockedTokenOfflineSaveCmd
(),
CreateMultisignTransferCmd
(),
MultisignTransferCmd
(),
SetWithdrawProxyCmd
(),
)
return
cmd
}
...
...
plugin/dapp/cross2eth/cmd/build/abi/Chain33BridgeBank.abi
View file @
cd8c1025
[{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"address","name":"_oracleAddress","type":"address"},{"internalType":"address","name":"_ethereumBridgeAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_beneficiary","type":"address"}],"name":"LogBridgeTokenMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_ownerFrom","type":"address"},{"indexed":false,"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"LogEthereumTokenBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_bridgeToken","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_ownerFrom","type":"address"},{"indexed":false,"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"indexed":false,"internalType":"address","name":"_proxyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"LogEthereumTokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_to","type":"bytes"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"LogLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"}],"name":"LogNewBridgeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"LogUnlock","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"addToken2LockList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bridgeTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeTokenCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bridgeTokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"internalType":"address","name":"_ethereumTokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnBridgeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint8","name":"_percents","type":"uint8"}],"name":"configLockedTokenOfflineSave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"addresspayable","name":"_offlineSave","type":"address"}],"name":"configOfflineSaveAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"createNewBridgeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethereumBridge","outputs":[{"internalType":"contractEthereumBridge","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getEthereumDepositStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"getLockedTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"getToken2address","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getofflineSaveCfg","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"hasBridgeTokenCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"highThreshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_recipient","type":"bytes"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lock","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lockNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lowThreshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_ethereumSender","type":"bytes"},{"internalType":"addresspayable","name":"_intendedRecipient","type":"address"},{"internalType":"address","name":"_bridgeTokenAddress","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintBridgeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"offlineSave","outputs":[{"internalType":"addresspayable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"offlineSaveCfgs","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint8","name":"_percents","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"internalType":"contractOracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"addresspayable","name":"_proxyReceiver","type":"address"}],"name":"setWithdrawProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"token2address","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tokenAllow2Lock","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"addresspayable","name":"_recipient","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"viewEthereumDeposit","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"addresspayable","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"internalType":"address","name":"_bridgeTokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawViaProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file
[{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"address","name":"_oracleAddress","type":"address"},{"internalType":"address","name":"_ethereumBridgeAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_beneficiary","type":"address"}],"name":"LogBridgeTokenMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_ownerFrom","type":"address"},{"indexed":false,"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"LogEthereumTokenBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_bridgeToken","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_ownerFrom","type":"address"},{"indexed":false,"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"indexed":false,"internalType":"address","name":"_proxyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"LogEthereumTokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_to","type":"bytes"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"LogLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"}],"name":"LogNewBridgeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"LogUnlock","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"addToken2LockList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bridgeTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeTokenCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bridgeTokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"internalType":"address","name":"_ethereumTokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnBridgeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint8","name":"_percents","type":"uint8"}],"name":"configLockedTokenOfflineSave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"addresspayable","name":"_offlineSave","type":"address"}],"name":"configOfflineSaveAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"createNewBridgeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethereumBridge","outputs":[{"internalType":"contractEthereumBridge","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getEthereumDepositStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"getLockedTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"getToken2address","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getofflineSaveCfg","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"hasBridgeTokenCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"highThreshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_recipient","type":"bytes"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lock","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lockNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lowThreshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_ethereumSender","type":"bytes"},{"internalType":"addresspayable","name":"_intendedRecipient","type":"address"},{"internalType":"address","name":"_bridgeTokenAddress","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintBridgeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"offlineSave","outputs":[{"internalType":"addresspayable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"offlineSaveCfgs","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint8","name":"_percents","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"internalType":"contractOracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"addresspayable","name":"_proxyReceiver","type":"address"}],"name":"setWithdrawProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"token2address","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tokenAllow2Lock","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"addresspayable","name":"_recipient","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"viewEthereumDeposit","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"addresspayable","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_ethereumReceiver","type":"bytes"},{"internalType":"address","name":"_bridgeTokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawViaProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file
plugin/dapp/cross2eth/cmd/build/docker-compose-cross2eth.yml
View file @
cd8c1025
...
...
@@ -5,6 +5,11 @@ services:
entrypoint
:
[
"
node"
,
"
/app/ganache-core.docker.cli.js"
,
"
-a"
,
"
20"
,
"
-b"
,
"
2"
,
"
--debug"
,
"
-m"
,
"
coast
bar
giraffe
art
venue
decide
symbol
law
visual
crater
vital
fold"
,
"
-e"
,
"
1000"
]
image
:
trufflesuite/ganache-cli:latest
ebrelayerProxy
:
build
:
context
:
.
dockerfile
:
Dockerfile-cross2eth
ebrelayera
:
build
:
context
:
.
...
...
plugin/dapp/cross2eth/cmd/build/public/mainPubilcRelayerTest.sh
View file @
cd8c1025
...
...
@@ -256,69 +256,56 @@ function TestChain33ToEthAssets() {
function
TestETH2Chain33Assets
()
{
echo
-e
"
${
GRE
}
===========
$FUNCNAME
begin ===========
${
NOC
}
"
echo
-e
"
${
GRE
}
=========== eth to chain33 在以太坊上锁定 ETH 资产,然后在 chain33 上 burn ===========
${
NOC
}
"
# 查询 ETH 这端 bridgeBank 地址原来是 0
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethBridgeBank
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"0"
# ETH 这端 lock 11个
result
=
$(${
CLIA
}
ethereum lock
-m
11
-k
"
${
ethTestAddrKey1
}
"
-r
"
${
chain33ReceiverAddr
}
"
)
result
=
$(${
CLIA
}
ethereum lock
-m
0.002
-k
"
${
ethTestAddrKey1
}
"
-r
"
${
chain33ReceiverAddr
}
"
)
cli_ret
"
${
result
}
"
"lock"
# eth 等待 2 个区块
sleep
4
# 查询 ETH 这端 bridgeBank 地址 11
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethBridgeBank
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"
11
"
cli_ret
"
${
result
}
"
"balance"
".balance"
"
0.002
"
sleep
${
maturityDegree
}
# chain33 chain33EthBridgeTokenAddr(ETH合约中)查询 lock 金额
result
=
$(${
Chain33Cli
}
evm query
-a
"
${
chain33EthBridgeTokenAddr
}
"
-c
"
${
chain33DeployAddr
}
"
-b
"balanceOf(
${
chain33ReceiverAddr
}
)"
)
# 结果是 11 * le8
is_equal
"
${
result
}
"
"1100000000"
# is_equal "${result}" "2000000000000000"
# 原来的数额
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethTestAddr2
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"1000"
echo
'#5.burn ETH from Chain33 ETH(Chain33)-----> Ethereum'
result
=
$(${
CLIA
}
chain33 burn
-m
5
-k
"
${
chain33ReceiverAddrKey
}
"
-r
"
${
ethTestAddr2
}
"
-t
"
${
chain33EthBridgeTokenAddr
}
"
)
result
=
$(${
CLIA
}
chain33 burn
-m
0.0003
-k
"
${
chain33ReceiverAddrKey
}
"
-r
"
${
ethTestAddr2
}
"
-t
"
${
chain33EthBridgeTokenAddr
}
"
)
cli_ret
"
${
result
}
"
"burn"
sleep
${
maturityDegree
}
echo
"check the balance on chain33"
result
=
$(${
Chain33Cli
}
evm query
-a
"
${
chain33EthBridgeTokenAddr
}
"
-c
"
${
chain33DeployAddr
}
"
-b
"balanceOf(
${
chain33ReceiverAddr
}
)"
)
# 结果是 11-5 * le8
is_equal
"
${
result
}
"
"600000000"
# is_equal "${result}" "1700000000000000"
# 查询 ETH 这端 bridgeBank 地址 0
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethBridgeBank
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"6"
# 比之前多 5
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethTestAddr2
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"1005"
cli_ret
"
${
result
}
"
"balance"
".balance"
"0.0017"
echo
'#5.burn ETH from Chain33 ETH(Chain33)-----> Ethereum 6'
result
=
$(${
CLIA
}
chain33 burn
-m
6
-k
"
${
chain33ReceiverAddrKey
}
"
-r
"
${
ethTestAddr2
}
"
-t
"
${
chain33EthBridgeTokenAddr
}
"
)
result
=
$(${
CLIA
}
chain33 burn
-m
0.0017
-k
"
${
chain33ReceiverAddrKey
}
"
-r
"
${
ethTestAddr2
}
"
-t
"
${
chain33EthBridgeTokenAddr
}
"
)
cli_ret
"
${
result
}
"
"burn"
sleep
${
maturityDegree
}
echo
"check the balance on chain33"
result
=
$(${
Chain33Cli
}
evm query
-a
"
${
chain33EthBridgeTokenAddr
}
"
-c
"
${
chain33DeployAddr
}
"
-b
"balanceOf(
${
chain33ReceiverAddr
}
)"
)
# 结果是 11-5 * le8
is_equal
"
${
result
}
"
"0"
# 查询 ETH 这端 bridgeBank 地址 0
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethBridgeBank
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"0"
# 比之前多 5
result
=
$(${
CLIA
}
ethereum balance
-o
"
${
ethTestAddr2
}
"
)
cli_ret
"
${
result
}
"
"balance"
".balance"
"1011"
echo
-e
"
${
GRE
}
===========
$FUNCNAME
end ===========
${
NOC
}
"
}
...
...
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethereum.go
View file @
cd8c1025
...
...
@@ -578,14 +578,7 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
return
}
var
toAddr
common
.
Address
tokenAddr
:=
common
.
HexToAddress
(
withdrawFromChain33TokenInfo
.
Address
)
if
tokenAddr
.
String
()
!=
""
{
toAddr
=
tokenAddr
}
else
{
//如果tokenAddr为空,则把toAddr设置为用户指定的地址
toAddr
=
chain33Msg
.
EthereumReceiver
}
//从chain33进行withdraw回来的token需要根据精度进行相应的缩放
if
8
!=
withdrawFromChain33TokenInfo
.
Decimal
{
if
withdrawFromChain33TokenInfo
.
Decimal
>
8
{
...
...
@@ -613,16 +606,38 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
ctx
:=
context
.
Background
()
timeout
,
cancel
:=
context
.
WithTimeout
(
ctx
,
time
.
Second
*
2
)
defer
cancel
()
var
intput
data
[]
byte
var
intput
Data
[]
byte
// ERC20 or BEP20 token transfer pack data
var
err
error
if
tokenAddr
.
String
()
!=
""
{
//判断是否要Pack EVM数据
intputdata
,
err
=
ethRelayer
.
callEvmData
(
chain33Msg
.
EthereumReceiver
,
chain33Msg
.
Amount
)
relayerLog
.
Error
(
"handleLogWithdraw"
,
"CallEvmData err"
,
err
)
var
toAddr
common
.
Address
var
balanceOfData
[]
byte
// ERC20 or BEP20 token balanceof pack data
if
tokenAddr
.
String
()
!=
ethtxs
.
EthNullAddr
{
//判断是否要Pack EVM数据
toAddr
=
tokenAddr
intputData
,
err
=
ethRelayer
.
packTransferData
(
chain33Msg
.
EthereumReceiver
,
chain33Msg
.
Amount
)
if
err
!=
nil
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"CallEvmData err"
,
err
)
return
}
//用签名的账户地址作为pack参数,toAddr作为合约地址
balanceOfData
,
err
=
ethRelayer
.
packBalanceOfData
(
chain33Msg
.
EthereumReceiver
)
if
err
!=
nil
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"callEvmBalanceData err"
,
err
)
return
}
}
else
{
//如果tokenAddr为空,则把toAddr设置为用户指定的地址
toAddr
=
chain33Msg
.
EthereumReceiver
}
//校验余额是否充足
if
ok
,
err
:=
ethRelayer
.
checkBalanceEnough
(
toAddr
,
chain33Msg
.
Amount
,
balanceOfData
);
!
ok
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"Failed to checkBalanceEnough:"
,
err
.
Error
())
return
}
//param: from,to,evm-packdata,amount
//交易构造
tx
,
err
:=
ethRelayer
.
newTx
(
ethRelayer
.
ethSender
,
toAddr
,
intput
d
ata
,
chain33Msg
.
Amount
)
tx
,
err
:=
ethRelayer
.
newTx
(
ethRelayer
.
ethSender
,
toAddr
,
intput
D
ata
,
chain33Msg
.
Amount
)
if
err
!=
nil
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"newTx err"
,
err
)
return
...
...
@@ -651,10 +666,45 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
return
}
func
(
ethRelayer
*
Relayer4Ethereum
)
checkReceiverPermission
(
addr
common
.
Address
,
amount
*
big
.
Int
,
symbol
string
)
(
bool
,
error
)
{
//TODO 检测提币用户下累计提币额度是否达到上限
return
true
,
nil
//return errors.New("permission denied")
func
(
ethRelayer
*
Relayer4Ethereum
)
checkBalanceEnough
(
addr
common
.
Address
,
amount
*
big
.
Int
,
inputdata
[]
byte
)
(
bool
,
error
)
{
//检测地址余额
var
balance
*
big
.
Int
var
err
error
if
inputdata
==
nil
{
balance
,
err
=
ethRelayer
.
clientSpec
.
BalanceAt
(
context
.
Background
(),
addr
,
nil
)
if
err
!=
nil
{
//retry
balance
,
err
=
ethRelayer
.
clientSpec
.
BalanceAt
(
context
.
Background
(),
addr
,
nil
)
if
err
!=
nil
{
return
false
,
err
}
}
}
else
{
var
msg
ethereum
.
CallMsg
msg
.
To
=
&
addr
//合约地址
msg
.
Data
=
inputdata
result
,
err
:=
ethRelayer
.
clientSpec
.
CallContract
(
context
.
Background
(),
msg
,
nil
)
if
err
!=
nil
{
//retry
result
,
err
=
ethRelayer
.
clientSpec
.
CallContract
(
context
.
Background
(),
msg
,
nil
)
if
err
!=
nil
{
return
false
,
err
}
}
var
ok
bool
balance
,
ok
=
big
.
NewInt
(
1
)
.
SetString
(
common
.
Bytes2Hex
(
result
),
16
)
if
!
ok
{
return
false
,
errors
.
New
(
fmt
.
Sprintf
(
"token balance err:%v"
,
common
.
Bytes2Hex
(
result
)))
}
}
//与要发动的金额大小进行比较
if
balance
.
Cmp
(
amount
)
>
0
{
return
true
,
nil
}
return
false
,
errors
.
New
(
"Insufficient balance"
)
}
func
(
ethRelayer
*
Relayer4Ethereum
)
signTx
(
tx
*
types
.
Transaction
,
key
*
ecdsa
.
PrivateKey
)
(
*
types
.
Transaction
,
error
)
{
...
...
@@ -671,7 +721,7 @@ func (ethRelayer *Relayer4Ethereum) signTx(tx *types.Transaction, key *ecdsa.Pri
return
tx
,
nil
}
func
(
ethRelayer
*
Relayer4Ethereum
)
callEvm
Data
(
_to
common
.
Address
,
_value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
ethRelayer
*
Relayer4Ethereum
)
packTransfer
Data
(
_to
common
.
Address
,
_value
*
big
.
Int
)
([]
byte
,
error
)
{
parsed
,
err
:=
abi
.
JSON
(
strings
.
NewReader
(
generated
.
ERC20ABI
))
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -682,6 +732,18 @@ func (ethRelayer *Relayer4Ethereum) callEvmData(_to common.Address, _value *big.
}
return
abidata
,
nil
}
func
(
ethRelayer
*
Relayer4Ethereum
)
packBalanceOfData
(
_to
common
.
Address
)
([]
byte
,
error
)
{
parsed
,
err
:=
abi
.
JSON
(
strings
.
NewReader
(
generated
.
ERC20ABI
))
if
err
!=
nil
{
return
nil
,
err
}
abidata
,
err
:=
parsed
.
Pack
(
"balanceOf"
,
_to
)
if
err
!=
nil
{
return
nil
,
err
}
return
abidata
,
nil
}
func
(
ethRelayer
*
Relayer4Ethereum
)
newTx
(
from
,
to
common
.
Address
,
input
[]
byte
,
value
*
big
.
Int
)
(
*
types
.
Transaction
,
error
)
{
price
,
err
:=
ethRelayer
.
clientSpec
.
SuggestGasPrice
(
context
.
Background
())
...
...
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethtxs/contracts_test.go
View file @
cd8c1025
...
...
@@ -29,7 +29,7 @@ import (
var
(
chain33Addr
=
"14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
//ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f"
ethToken
Addr
=
"0x0000000000000000000000000000000000000000"
EthNull
Addr
=
"0x0000000000000000000000000000000000000000"
)
type
suiteContracts
struct
{
...
...
@@ -81,7 +81,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
event
:=
&
events
.
LockEvent
{
From
:
c
.
para
.
InitValidators
[
0
],
To
:
to
,
Token
:
common
.
HexToAddress
(
ethToken
Addr
),
Token
:
common
.
HexToAddress
(
EthNull
Addr
),
Symbol
:
"eth"
,
Value
:
big
.
NewInt
(
10000
*
10000
*
10000
),
Nonce
:
big
.
NewInt
(
1
),
...
...
@@ -91,7 +91,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
assert
.
NotEmpty
(
c
.
T
(),
witnessClaim
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumChainID
,
int64
(
1
))
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
BridgeBrankAddr
,
c
.
x2EthDeployInfo
.
BridgeBank
.
Address
.
String
())
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
ethToken
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
EthNull
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
Symbol
,
event
.
Symbol
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumSender
,
event
.
From
.
String
())
//assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To))
...
...
@@ -110,7 +110,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
event
:=
&
events
.
BurnEvent
{
OwnerFrom
:
c
.
para
.
InitValidators
[
0
],
Chain33Receiver
:
to
,
Token
:
common
.
HexToAddress
(
ethToken
Addr
),
Token
:
common
.
HexToAddress
(
EthNull
Addr
),
Symbol
:
"bty"
,
Amount
:
big
.
NewInt
(
100
),
Nonce
:
big
.
NewInt
(
2
),
...
...
@@ -120,7 +120,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
assert
.
NotEmpty
(
c
.
T
(),
witnessClaim
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumChainID
,
int64
(
1
))
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
BridgeBrankAddr
,
c
.
x2EthDeployInfo
.
BridgeBank
.
Address
.
String
())
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
ethToken
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
EthNull
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
Symbol
,
event
.
Symbol
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumSender
,
event
.
OwnerFrom
.
String
())
//assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver))
...
...
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethtxs/types.go
View file @
cd8c1025
...
...
@@ -12,6 +12,7 @@ const (
X2Eth
=
"x2ethereum"
BurnAction
=
"Chain33ToEthBurn"
LockAction
=
"Chain33ToEthLock"
EthNullAddr
=
"0x0000000000000000000000000000000000000000"
)
// OracleClaim : contains data required to make an OracleClaim
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment