From 71122e3504f81f102658bec92ed4ce4327d35e23 Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 15 Dec 2023 18:14:24 +0800 Subject: [PATCH 01/15] modify evm listener server --- bitcoin/evm_listener_service.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/bitcoin/evm_listener_service.go b/bitcoin/evm_listener_service.go index 937c24a6f9..f109e94aa9 100644 --- a/bitcoin/evm_listener_service.go +++ b/bitcoin/evm_listener_service.go @@ -119,7 +119,7 @@ func (eis *EVMListenerService) OnStart() error { eis.Logger.Error("EVMListenerService listener deposit Marshal failed: ", "err", err) return err } - eis.Logger.Info("EVMListenerService listener deposit event: ", "deposit", string(value)) + eis.Logger.Info("EVMListenerService listener deposit event: ", "num", i, "deposit", string(value)) } else if eventHash == common.HexToHash(eis.config.Evm.Withdraw) { data := WithdrawEvent{ FromAddress: TopicToAddress(vlog, 1), @@ -131,13 +131,18 @@ func (eis *EVMListenerService) OnStart() error { eis.Logger.Error("EVMListenerService listener withdraw Marshal failed: ", "err", err) return err } - eis.Logger.Info("EVMListenerService listener withdraw event: ", "withdraw", string(value)) + eis.Logger.Info("EVMListenerService listener withdraw event: ", "num", i, "withdraw", string(value)) amount := DataToBigInt(vlog, 1) err = eis.transferToBtc(DataToString(vlog, 0), amount.Int64()) if err != nil { eis.Logger.Error("EVMListenerService transferToBtc failed: ", "err", err) - // return err + // deal with Insufficient balance + if err.Error() == "unable to calculate change amount" { + time.Sleep(5 * time.Minute) + continue + } + return err } // eis.Logger.Info("EVMListenerService listener withdraw event: ", "withdraw", string(value)) } @@ -169,22 +174,19 @@ func (eis *EVMListenerService) transferToBtc(destAddrStr string, amount int64) e } inputs := make([]btcjson.TransactionInput, 0, 10) - totalInputAmount := int64(0) + totalInputAmount := btcutil.Amount(0) for _, unspentTx := range unspentTxs { - amountStr := strconv.FormatFloat(unspentTx.Amount*1e8, 'f', -1, 64) - unspentAmount, err := strconv.ParseInt(amountStr, 10, 64) - if err != nil { - eis.Logger.Error("EVMListenerService format unspentTx.Amount failed: ", "err", err) - return err - } - totalInputAmount += unspentAmount inputs = append(inputs, btcjson.TransactionInput{ Txid: unspentTx.TxID, Vout: unspentTx.Vout, }) + totalInputAmount += btcutil.Amount(unspentTx.Amount * 1e8) + if (int64(totalInputAmount) + eis.config.Fee) > amount { + break + } } // eis.Logger.Info("ListUnspentMinMaxAddresses", "totalInputAmount", totalInputAmount) - changeAmount := totalInputAmount - eis.config.Fee - amount // fee + changeAmount := int64(totalInputAmount) - eis.config.Fee - amount // fee if changeAmount > 0 { changeAddr, err := btcutil.DecodeAddress(sourceAddrStr, defaultNet) if err != nil { @@ -222,7 +224,7 @@ func (eis *EVMListenerService) transferToBtc(destAddrStr string, amount int64) e eis.Logger.Error("EVMListenerService transferToBtc SendRawTransaction failed: ", "err", err) return err } - eis.Logger.Info("EVMListenerService tx success: ", "fromAddress", sourceAddrStr, "toAddress", destAddrStr, "hash", txHash.String()) + eis.Logger.Info("EVMListenerService tx success: ", "fromAddress", sourceAddrStr, "toAddress", destAddrStr, "amount", amount, "hash", txHash.String()) return nil } From f71b7561d2bf0777ed6e4fa74f013f9b77ce0319 Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 15 Dec 2023 18:25:40 +0800 Subject: [PATCH 02/15] modify evm listener server --- bitcoin/evm_listener_service.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bitcoin/evm_listener_service.go b/bitcoin/evm_listener_service.go index f109e94aa9..36487d4c52 100644 --- a/bitcoin/evm_listener_service.go +++ b/bitcoin/evm_listener_service.go @@ -142,7 +142,8 @@ func (eis *EVMListenerService) OnStart() error { time.Sleep(5 * time.Minute) continue } - return err + time.Sleep(1 * time.Minute) + continue } // eis.Logger.Info("EVMListenerService listener withdraw event: ", "withdraw", string(value)) } From 5d57604c1a74b834597222e7accb2f33e89c6832 Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 15 Dec 2023 18:31:56 +0800 Subject: [PATCH 03/15] modify evm listener server --- bitcoin/evm_listener_service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitcoin/evm_listener_service.go b/bitcoin/evm_listener_service.go index 36487d4c52..02d2199ba3 100644 --- a/bitcoin/evm_listener_service.go +++ b/bitcoin/evm_listener_service.go @@ -225,7 +225,7 @@ func (eis *EVMListenerService) transferToBtc(destAddrStr string, amount int64) e eis.Logger.Error("EVMListenerService transferToBtc SendRawTransaction failed: ", "err", err) return err } - eis.Logger.Info("EVMListenerService tx success: ", "fromAddress", sourceAddrStr, "toAddress", destAddrStr, "amount", amount, "hash", txHash.String()) + eis.Logger.Info("EVMListenerService tx success: ", "from", sourceAddrStr, "to", destAddrStr, "amount", amount, "hash", txHash.String()) return nil } From 6c4c354746fd3da66a26053fb9eca418e836c36c Mon Sep 17 00:00:00 2001 From: robertcc Date: Mon, 18 Dec 2023 12:16:19 +0800 Subject: [PATCH 04/15] modify evm listener server --- bitcoin/testdata/abi.json | 356 +++++++++++++++++++++++++++++++++++++- 1 file changed, 355 insertions(+), 1 deletion(-) diff --git a/bitcoin/testdata/abi.json b/bitcoin/testdata/abi.json index 28ad5f8d2a..cc822de7b1 100644 --- a/bitcoin/testdata/abi.json +++ b/bitcoin/testdata/abi.json @@ -1 +1,355 @@ -[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"to_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from_address","type":"address"},{"indexed":false,"internalType":"string","name":"btc_address","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawEvent","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_address","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"btc_address","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[ + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "btc_address", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawEvent", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "b2_to_address", + "type": "address" + }, + { + "internalType": "uint256", + "name": "btc_amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "btc_address", + "type": "string" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file From 7f63cd372a92c47b7b7cd62aa879ad469528b1ff Mon Sep 17 00:00:00 2001 From: robertcc Date: Mon, 18 Dec 2023 16:08:12 +0800 Subject: [PATCH 05/15] modify evm listener server --- bitcoin/testdata/bitcoin.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bitcoin/testdata/bitcoin.toml b/bitcoin/testdata/bitcoin.toml index 6ee24be797..8b12056ba5 100644 --- a/bitcoin/testdata/bitcoin.toml +++ b/bitcoin/testdata/bitcoin.toml @@ -5,7 +5,7 @@ rpc-user = "b2node" rpc-pass = "b2node" wallet-name = "b2node" destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" -enable-indexer = true +enable-indexer = false indexer-listen-address = "tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv" source-address = "tb1qr2ssscefkjeehv5kl0alhwj976v6cpxqlskn7n" fee = 200000 @@ -20,7 +20,7 @@ aa-sca-registry = "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF3" aa-kernel-factory = "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF4" [evm] -enable-listener = true +enable-listener = false rpc-host = "http://127.0.0.1" rpc-port = 8545 contract-address = "0x47549F0f902F8E0DB96aBb16E06Da60751516F54" From 657d0f740862ad6491f8d054a8587234df34361f Mon Sep 17 00:00:00 2001 From: robertcc Date: Mon, 18 Dec 2023 16:48:44 +0800 Subject: [PATCH 06/15] modify evm listener server --- bitcoin/config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitcoin/config_test.go b/bitcoin/config_test.go index 726d89f7a5..76b6e90066 100644 --- a/bitcoin/config_test.go +++ b/bitcoin/config_test.go @@ -37,7 +37,7 @@ func TestConfig(t *testing.T) { require.Equal(t, "b2node", config.RPCPass) require.Equal(t, "b2node", config.WalletName) require.Equal(t, "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz", config.Destination) - require.Equal(t, true, config.EnableIndexer) + require.Equal(t, false, config.EnableIndexer) require.Equal(t, "tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv", config.IndexerListenAddress) require.Equal(t, "localhost:8545", config.Bridge.EthRPCURL) require.Equal(t, "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF2", config.Bridge.ContractAddress) From eef3d6dcad3ef22e81f45c236c5216dc17a82111 Mon Sep 17 00:00:00 2001 From: robertcc Date: Mon, 18 Dec 2023 20:50:38 +0800 Subject: [PATCH 07/15] modify evm listener server --- .env.bitcoin | 33 ++++++++++++++++++ bitcoin/config.go | 65 +++++++++++++++++++++++++++-------- bitcoin/config_test.go | 13 +++++-- bitcoin/testdata/bitcoin.toml | 4 +-- 4 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 .env.bitcoin diff --git a/.env.bitcoin b/.env.bitcoin new file mode 100644 index 0000000000..183413100e --- /dev/null +++ b/.env.bitcoin @@ -0,0 +1,33 @@ +BITCOIN_NETWORK_NAME="testnet" +BITCOIN_RPC_HOST="127.0.0.1" +BITCOIN_RPC_PORT="8888" +BITCOIN_RPC_USER="test" +BITCOIN_RPC_PASS="123456" +BITCOIN_WALLET_NAME="test" +BITCOIN_DESTINATION="tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv" +BITCOIN_ENABLE_INDEXER="false" +BITCOIN_INDEXER_LISTEN_ADDRESS="tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" +BITCOIN_BRIDGE_ETH_RPC_URL="127.0.0.1:8545" +BITCOIN_BRIDGE_CONTRACT_ADDRESS="0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF22" +BITCOIN_BRIDGE_ETH_PRIV_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" +BITCOIN_BRIDGE_ABI="aaa.abi" +BITCOIN_BRIDGE_GAS_LIMIT="23333" +BITCOIN_ENABLE_COMMITTER=false +BITCOIN_STATE_HOST="localhost" +BITCOIN_STATE_PORT="5432" +BITCOIN_STATE_USER="user" +BITCOIN_STATE_PASS="password" +BITCOIN_STATE_DB_NAME="db" +BITCOIN_BRIDGE_AA_SCA_REGISTRY="0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF24" +BITCOIN_BRIDGE_AA_KERNEL_FACTORY="0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF25" +BITCOIN_EVM_ENABLE_LISTENER=false +BITCOIN_EVM_RPC_HOST="http://127.0.0.1" +BITCOIN_EVM_RPC_PORT=8123 +BITCOIN_EVM_CONTRACT_ADDRESS="0x3c950C4D15311dB39F85441316983b3845396C6e" +BITCOIN_EVM_START_HEIGHT=0 +BITCOIN_EVM_DEPOSIT="0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee89" +BITCOIN_EVM_WITHDRAW="0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add86" + + + + diff --git a/bitcoin/config.go b/bitcoin/config.go index 6931162441..e6726a3992 100644 --- a/bitcoin/config.go +++ b/bitcoin/config.go @@ -110,36 +110,71 @@ func LoadBitcoinConfig(homePath string) (*BitconConfig, error) { if err != nil { // if file not exist use default config // TODO: add gen config command after, The default configuration may not be required - if os.IsNotExist(err) { - config.NetworkName = "signet" - config.RPCHost = "localhost" - config.RPCPort = "8332" - config.RPCUser = "user" - config.RPCPass = "password" - config.WalletName = "walletname" - config.Destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" - config.IndexerListenAddress = "tb1qsja4hvx66jr9grgmt8452letmz37gmludcrnup" - config.EnableIndexer = false - config.EnableCommitter = false - return &config, nil + if !os.IsNotExist(err) { + return nil, err } - return nil, err + //config.NetworkName = "signet" + //config.RPCHost = "localhost" + //config.RPCPort = "8332" + //config.RPCUser = "user" + //config.RPCPass = "password" + //config.WalletName = "walletname" + //config.Destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" + //config.IndexerListenAddress = "tb1qsja4hvx66jr9grgmt8452letmz37gmludcrnup" + //config.EnableIndexer = false + //config.EnableCommitter = false + //return &config, nil } v := viper.New() v.SetConfigFile(configFile) - v.AutomaticEnv() v.SetEnvPrefix("BITCOIN") v.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) + v.AutomaticEnv() if err := v.ReadInConfig(); err != nil { - return nil, err + if !os.IsNotExist(err) { + return nil, err + } + // Load from environment variables if not found in the config file + v.BindEnv("network-name", "BITCOIN_NETWORK_NAME") + v.BindEnv("rpc-host", "BITCOIN_RPC_HOST") + v.BindEnv("rpc-port", "BITCOIN_RPC_PORT") + v.BindEnv("rpc-user", "BITCOIN_RPC_USER") + v.BindEnv("rpc-pass", "BITCOIN_RPC_PASS") + v.BindEnv("wallet-name", "BITCOIN_WALLET_NAME") + v.BindEnv("destination", "BITCOIN_DESTINATION") + v.BindEnv("enable-indexer", "BITCOIN_ENABLE_INDEXER") + v.BindEnv("enable-committer", "BITCOIN_ENABLE_COMMITTER") + v.BindEnv("indexer-listen-address", "BITCOIN_INDEXER_LISTEN_ADDRESS") + v.BindEnv("bridge.eth-rpc-url", "BITCOIN_BRIDGE_ETH_RPC_URL") + v.BindEnv("bridge.eth-priv-key", "BITCOIN_BRIDGE_ETH_PRIV_KEY") + v.BindEnv("bridge.contract-address", "BITCOIN_BRIDGE_CONTRACT_ADDRESS") + v.BindEnv("bridge.abi", "BITCOIN_BRIDGE_ABI") + v.BindEnv("bridge.gas-limit", "BITCOIN_BRIDGE_GAS_LIMIT") + v.BindEnv("bridge.aa-sca-registry", "BITCOIN_BRIDGE_AA_SCA_REGISTRY") + v.BindEnv("bridge.aa-kernel-factory", "BITCOIN_BRIDGE_AA_KERNEL_FACTORY") + v.BindEnv("state.host", "BITCOIN_STATE_HOST") + v.BindEnv("state.port", "BITCOIN_STATE_PORT") + v.BindEnv("state.user", "BITCOIN_STATE_USER") + v.BindEnv("state.pass", "BITCOIN_STATE_PASS") + v.BindEnv("state.db-name", "BITCOIN_STATE_DB_NAME") + v.BindEnv("source-address", "BITCOIN_SOURCE_ADDRESS") + v.BindEnv("fee", "BITCOIN_FEE") + v.BindEnv("evm.enable-listener", "BITCOIN_EVM_ENABLE_LISTENER") + v.BindEnv("evm.rpc-host", "BITCOIN_EVM_RPC_HOST") + v.BindEnv("evm.rpc-port", "BITCOIN_EVM_RPC_PORT") + v.BindEnv("evm.contract-address", "BITCOIN_EVM_CONTRACT_ADDRESS") + v.BindEnv("evm.start-height", "BITCOIN_EVM_START_HEIGHT") + v.BindEnv("evm.deposit", "BITCOIN_EVM_DEPOSIT") + v.BindEnv("evm.withdraw", "BITCOIN_EVM_WITHDRAW") } err = v.Unmarshal(&config) if err != nil { return nil, err } + return &config, nil } diff --git a/bitcoin/config_test.go b/bitcoin/config_test.go index 76b6e90066..af7c2ed7bf 100644 --- a/bitcoin/config_test.go +++ b/bitcoin/config_test.go @@ -37,7 +37,7 @@ func TestConfig(t *testing.T) { require.Equal(t, "b2node", config.RPCPass) require.Equal(t, "b2node", config.WalletName) require.Equal(t, "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz", config.Destination) - require.Equal(t, false, config.EnableIndexer) + require.Equal(t, true, config.EnableIndexer) require.Equal(t, "tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv", config.IndexerListenAddress) require.Equal(t, "localhost:8545", config.Bridge.EthRPCURL) require.Equal(t, "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF2", config.Bridge.ContractAddress) @@ -68,9 +68,18 @@ func TestConfigEnv(t *testing.T) { os.Setenv("BITCOIN_STATE_USER", "user") os.Setenv("BITCOIN_STATE_PASS", "password") os.Setenv("BITCOIN_STATE_DB_NAME", "db") + os.Setenv("BITCOIN_ENABLE_COMMITTER", "false") os.Setenv("BITCOIN_BRIDGE_AA_SCA_REGISTRY", "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF23") os.Setenv("BITCOIN_BRIDGE_AA_KERNEL_FACTORY", "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF24") - config, err := bitcoin.LoadBitcoinConfig("./testdata") + os.Setenv("BITCOIN_EVM_ENABLE_LISTENER", "false") + os.Setenv("BITCOIN_EVM_RPC_HOST", "http://127.0.0.1") + os.Setenv("BITCOIN_EVM_RPC_PORT", "8123") + os.Setenv("BITCOIN_EVM_CONTRACT_ADDRESS", "0x3c950C4D15311dB39F85441316983b3845396C6d") + os.Setenv("BITCOIN_EVM_START_HEIGHT", "0") + os.Setenv("BITCOIN_EVM_DEPOSIT", "0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee88") + os.Setenv("BITCOIN_EVM_WITHDRAW", "0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add85") + + config, err := bitcoin.LoadBitcoinConfig("./") require.NoError(t, err) require.Equal(t, "testnet", config.NetworkName) require.Equal(t, "127.0.0.1", config.RPCHost) diff --git a/bitcoin/testdata/bitcoin.toml b/bitcoin/testdata/bitcoin.toml index 8b12056ba5..6ee24be797 100644 --- a/bitcoin/testdata/bitcoin.toml +++ b/bitcoin/testdata/bitcoin.toml @@ -5,7 +5,7 @@ rpc-user = "b2node" rpc-pass = "b2node" wallet-name = "b2node" destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" -enable-indexer = false +enable-indexer = true indexer-listen-address = "tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv" source-address = "tb1qr2ssscefkjeehv5kl0alhwj976v6cpxqlskn7n" fee = 200000 @@ -20,7 +20,7 @@ aa-sca-registry = "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF3" aa-kernel-factory = "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF4" [evm] -enable-listener = false +enable-listener = true rpc-host = "http://127.0.0.1" rpc-port = 8545 contract-address = "0x47549F0f902F8E0DB96aBb16E06Da60751516F54" From d59212c904fd67ce4d1e18289a7ada6896c2822c Mon Sep 17 00:00:00 2001 From: robertcc Date: Tue, 19 Dec 2023 10:02:43 +0800 Subject: [PATCH 08/15] modify evm listener server --- bitcoin/config.go | 155 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 124 insertions(+), 31 deletions(-) diff --git a/bitcoin/config.go b/bitcoin/config.go index e6726a3992..e79e705717 100644 --- a/bitcoin/config.go +++ b/bitcoin/config.go @@ -137,37 +137,130 @@ func LoadBitcoinConfig(homePath string) (*BitconConfig, error) { return nil, err } // Load from environment variables if not found in the config file - v.BindEnv("network-name", "BITCOIN_NETWORK_NAME") - v.BindEnv("rpc-host", "BITCOIN_RPC_HOST") - v.BindEnv("rpc-port", "BITCOIN_RPC_PORT") - v.BindEnv("rpc-user", "BITCOIN_RPC_USER") - v.BindEnv("rpc-pass", "BITCOIN_RPC_PASS") - v.BindEnv("wallet-name", "BITCOIN_WALLET_NAME") - v.BindEnv("destination", "BITCOIN_DESTINATION") - v.BindEnv("enable-indexer", "BITCOIN_ENABLE_INDEXER") - v.BindEnv("enable-committer", "BITCOIN_ENABLE_COMMITTER") - v.BindEnv("indexer-listen-address", "BITCOIN_INDEXER_LISTEN_ADDRESS") - v.BindEnv("bridge.eth-rpc-url", "BITCOIN_BRIDGE_ETH_RPC_URL") - v.BindEnv("bridge.eth-priv-key", "BITCOIN_BRIDGE_ETH_PRIV_KEY") - v.BindEnv("bridge.contract-address", "BITCOIN_BRIDGE_CONTRACT_ADDRESS") - v.BindEnv("bridge.abi", "BITCOIN_BRIDGE_ABI") - v.BindEnv("bridge.gas-limit", "BITCOIN_BRIDGE_GAS_LIMIT") - v.BindEnv("bridge.aa-sca-registry", "BITCOIN_BRIDGE_AA_SCA_REGISTRY") - v.BindEnv("bridge.aa-kernel-factory", "BITCOIN_BRIDGE_AA_KERNEL_FACTORY") - v.BindEnv("state.host", "BITCOIN_STATE_HOST") - v.BindEnv("state.port", "BITCOIN_STATE_PORT") - v.BindEnv("state.user", "BITCOIN_STATE_USER") - v.BindEnv("state.pass", "BITCOIN_STATE_PASS") - v.BindEnv("state.db-name", "BITCOIN_STATE_DB_NAME") - v.BindEnv("source-address", "BITCOIN_SOURCE_ADDRESS") - v.BindEnv("fee", "BITCOIN_FEE") - v.BindEnv("evm.enable-listener", "BITCOIN_EVM_ENABLE_LISTENER") - v.BindEnv("evm.rpc-host", "BITCOIN_EVM_RPC_HOST") - v.BindEnv("evm.rpc-port", "BITCOIN_EVM_RPC_PORT") - v.BindEnv("evm.contract-address", "BITCOIN_EVM_CONTRACT_ADDRESS") - v.BindEnv("evm.start-height", "BITCOIN_EVM_START_HEIGHT") - v.BindEnv("evm.deposit", "BITCOIN_EVM_DEPOSIT") - v.BindEnv("evm.withdraw", "BITCOIN_EVM_WITHDRAW") + err = v.BindEnv("network-name", "BITCOIN_NETWORK_NAME") + if err != nil { + return nil, err + } + err = v.BindEnv("rpc-host", "BITCOIN_RPC_HOST") + if err != nil { + return nil, err + } + err = v.BindEnv("rpc-port", "BITCOIN_RPC_PORT") + if err != nil { + return nil, err + } + err = v.BindEnv("rpc-user", "BITCOIN_RPC_USER") + if err != nil { + return nil, err + } + err = v.BindEnv("rpc-pass", "BITCOIN_RPC_PASS") + if err != nil { + return nil, err + } + err = v.BindEnv("wallet-name", "BITCOIN_WALLET_NAME") + if err != nil { + return nil, err + } + err = v.BindEnv("destination", "BITCOIN_DESTINATION") + if err != nil { + return nil, err + } + err = v.BindEnv("enable-indexer", "BITCOIN_ENABLE_INDEXER") + if err != nil { + return nil, err + } + err = v.BindEnv("enable-committer", "BITCOIN_ENABLE_COMMITTER") + if err != nil { + return nil, err + } + err = v.BindEnv("indexer-listen-address", "BITCOIN_INDEXER_LISTEN_ADDRESS") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.eth-rpc-url", "BITCOIN_BRIDGE_ETH_RPC_URL") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.eth-priv-key", "BITCOIN_BRIDGE_ETH_PRIV_KEY") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.contract-address", "BITCOIN_BRIDGE_CONTRACT_ADDRESS") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.abi", "BITCOIN_BRIDGE_ABI") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.gas-limit", "BITCOIN_BRIDGE_GAS_LIMIT") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.aa-sca-registry", "BITCOIN_BRIDGE_AA_SCA_REGISTRY") + if err != nil { + return nil, err + } + err = v.BindEnv("bridge.aa-kernel-factory", "BITCOIN_BRIDGE_AA_KERNEL_FACTORY") + if err != nil { + return nil, err + } + err = v.BindEnv("state.host", "BITCOIN_STATE_HOST") + if err != nil { + return nil, err + } + err = v.BindEnv("state.port", "BITCOIN_STATE_PORT") + if err != nil { + return nil, err + } + err = v.BindEnv("state.user", "BITCOIN_STATE_USER") + if err != nil { + return nil, err + } + err = v.BindEnv("state.pass", "BITCOIN_STATE_PASS") + if err != nil { + return nil, err + } + err = v.BindEnv("state.db-name", "BITCOIN_STATE_DB_NAME") + if err != nil { + return nil, err + } + err = v.BindEnv("source-address", "BITCOIN_SOURCE_ADDRESS") + if err != nil { + return nil, err + } + err = v.BindEnv("fee", "BITCOIN_FEE") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.enable-listener", "BITCOIN_EVM_ENABLE_LISTENER") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.rpc-host", "BITCOIN_EVM_RPC_HOST") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.rpc-port", "BITCOIN_EVM_RPC_PORT") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.contract-address", "BITCOIN_EVM_CONTRACT_ADDRESS") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.start-height", "BITCOIN_EVM_START_HEIGHT") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.deposit", "BITCOIN_EVM_DEPOSIT") + if err != nil { + return nil, err + } + err = v.BindEnv("evm.withdraw", "BITCOIN_EVM_WITHDRAW") + if err != nil { + return nil, err + } } err = v.Unmarshal(&config) From 9cb155d14ee35bc0dfcf45dcbeff0d65a6973210 Mon Sep 17 00:00:00 2001 From: robertcc Date: Tue, 19 Dec 2023 10:08:03 +0800 Subject: [PATCH 09/15] modify evm listener server --- bitcoin/config.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/bitcoin/config.go b/bitcoin/config.go index e79e705717..123a3f0f27 100644 --- a/bitcoin/config.go +++ b/bitcoin/config.go @@ -113,17 +113,17 @@ func LoadBitcoinConfig(homePath string) (*BitconConfig, error) { if !os.IsNotExist(err) { return nil, err } - //config.NetworkName = "signet" - //config.RPCHost = "localhost" - //config.RPCPort = "8332" - //config.RPCUser = "user" - //config.RPCPass = "password" - //config.WalletName = "walletname" - //config.Destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" - //config.IndexerListenAddress = "tb1qsja4hvx66jr9grgmt8452letmz37gmludcrnup" - //config.EnableIndexer = false - //config.EnableCommitter = false - //return &config, nil + // config.NetworkName = "signet" + // config.RPCHost = "localhost" + // config.RPCPort = "8332" + // config.RPCUser = "user" + // config.RPCPass = "password" + // config.WalletName = "walletname" + // config.Destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" + // config.IndexerListenAddress = "tb1qsja4hvx66jr9grgmt8452letmz37gmludcrnup" + // config.EnableIndexer = false + // config.EnableCommitter = false + // return &config, nil } v := viper.New() From d462a8dcfa209eb1e3cf63aff7788deeec73cbd4 Mon Sep 17 00:00:00 2001 From: robertcc Date: Wed, 20 Dec 2023 11:16:20 +0800 Subject: [PATCH 10/15] modify evm listener server --- bitcoin/config.go | 24 ---- bitcoin/evm_listener_service.go | 167 +++++++++++++++++---------- bitcoin/evm_listener_service_test.go | 84 +++++++++++++- bitcoin/testdata/bitcoin.toml | 4 - server/start.go | 2 +- 5 files changed, 187 insertions(+), 94 deletions(-) diff --git a/bitcoin/config.go b/bitcoin/config.go index 123a3f0f27..e7fb0fad6b 100644 --- a/bitcoin/config.go +++ b/bitcoin/config.go @@ -49,8 +49,6 @@ type BitconConfig struct { Bridge BridgeConfig `mapstructure:"bridge"` // Dsn defines the state db dsn StateConfig StateConfig `mapstructure:"state"` - // SourceAddress defines the bitcoin send source address - SourceAddress string `mapstructure:"source-address"` // Fee defines the bitcoin tx fee Fee int64 `mapstructure:"fee"` // Evm defines the evm config @@ -85,12 +83,6 @@ type StateConfig struct { type EvmConfig struct { // EnableListener defines whether to enable the listener EnableListener bool `mapstructure:"enable-listener"` - // RPCHost defines the evm rpc host - RPCHost string `mapstructure:"rpc-host"` - // RPCPort defines the evm rpc port - RPCPort string `mapstructure:"rpc-port"` - // ContractAddress defines the contract address - ContractAddress string `mapstructure:"contract-address"` // StartHeight defines the start height StartHeight int64 `mapstructure:"start-height"` // Deposit defines the deposit event hash @@ -225,10 +217,6 @@ func LoadBitcoinConfig(homePath string) (*BitconConfig, error) { if err != nil { return nil, err } - err = v.BindEnv("source-address", "BITCOIN_SOURCE_ADDRESS") - if err != nil { - return nil, err - } err = v.BindEnv("fee", "BITCOIN_FEE") if err != nil { return nil, err @@ -237,18 +225,6 @@ func LoadBitcoinConfig(homePath string) (*BitconConfig, error) { if err != nil { return nil, err } - err = v.BindEnv("evm.rpc-host", "BITCOIN_EVM_RPC_HOST") - if err != nil { - return nil, err - } - err = v.BindEnv("evm.rpc-port", "BITCOIN_EVM_RPC_PORT") - if err != nil { - return nil, err - } - err = v.BindEnv("evm.contract-address", "BITCOIN_EVM_CONTRACT_ADDRESS") - if err != nil { - return nil, err - } err = v.BindEnv("evm.start-height", "BITCOIN_EVM_START_HEIGHT") if err != nil { return nil, err diff --git a/bitcoin/evm_listener_service.go b/bitcoin/evm_listener_service.go index 02d2199ba3..8a1f9f78e3 100644 --- a/bitcoin/evm_listener_service.go +++ b/bitcoin/evm_listener_service.go @@ -24,7 +24,12 @@ import ( "strconv" "time" - "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/chaincfg/chainhash" + + "github.com/btcsuite/btcd/txscript" + + "github.com/btcsuite/btcd/wire" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" btcrpcclient "github.com/btcsuite/btcd/rpcclient" @@ -65,7 +70,7 @@ func NewEVMListenerService( func (eis *EVMListenerService) OnStart() error { lastBlock := eis.config.Evm.StartHeight addresses := []common.Address{ - common.HexToAddress(eis.config.Evm.ContractAddress), + common.HexToAddress(eis.config.Bridge.ContractAddress), } topics := [][]common.Hash{ { @@ -73,6 +78,8 @@ func (eis *EVMListenerService) OnStart() error { common.HexToHash(eis.config.Evm.Withdraw), }, } + destAddresses := make([]string, 0, 10) + amounts := make([]int64, 0, 10) for { height, err := eis.ethCli.BlockNumber(context.Background()) if err != nil { @@ -86,8 +93,7 @@ func (eis *EVMListenerService) OnStart() error { eis.Logger.Error("EVMListenerService ParseInt latestBlock", "err", err) return err } - eis.Logger.Info("EVMListenerService ethClient height", "height", latestBlock) - + eis.Logger.Info("EVMListenerService ethClient height", "height", latestBlock, "lastBlock", lastBlock, "destAddresses", destAddresses) if latestBlock <= lastBlock { time.Sleep(time.Second * 10) continue @@ -105,6 +111,7 @@ func (eis *EVMListenerService) OnStart() error { eis.Logger.Error("EVMListenerService failed to fetch block", "height", i, "err", err) break } + for _, vlog := range logs { eventHash := common.BytesToHash(vlog.Topics[0].Bytes()) if eventHash == common.HexToHash(eis.config.Evm.Deposit) { @@ -134,28 +141,36 @@ func (eis *EVMListenerService) OnStart() error { eis.Logger.Info("EVMListenerService listener withdraw event: ", "num", i, "withdraw", string(value)) amount := DataToBigInt(vlog, 1) - err = eis.transferToBtc(DataToString(vlog, 0), amount.Int64()) - if err != nil { - eis.Logger.Error("EVMListenerService transferToBtc failed: ", "err", err) - // deal with Insufficient balance - if err.Error() == "unable to calculate change amount" { - time.Sleep(5 * time.Minute) - continue - } - time.Sleep(1 * time.Minute) - continue - } - // eis.Logger.Info("EVMListenerService listener withdraw event: ", "withdraw", string(value)) + destAddrStr := DataToString(vlog, 0) + destAddresses = append(destAddresses, destAddrStr) + amounts = append(amounts, amount.Int64()) } } lastBlock = i + if len(destAddresses) > 0 { + isOK, err := eis.IsUnspentTX() + if err != nil { + eis.Logger.Error("EVMListenerService transferToBtc IsUnspentTX failed: ", "err", err) + continue + } + if !isOK { + continue + } + eis.Logger.Info("EVMListenerService btc transfer", "destAddr", destAddresses, "amount", amounts) + err = eis.TransferToBtc(destAddresses, amounts) + if err != nil { + eis.Logger.Error("EVMListenerService transferToBtc failed: ", "err", err) + } else { + destAddresses = make([]string, 0, 10) + amounts = make([]int64, 0, 10) + } + } } } } -func (eis *EVMListenerService) transferToBtc(destAddrStr string, amount int64) error { - eis.Logger.Info("EVMListenerService btc transfer", "destAddrStr", destAddrStr, "amount", amount) - sourceAddrStr := eis.config.SourceAddress +func (eis *EVMListenerService) TransferToBtc(destAddresses []string, amounts []int64) error { + sourceAddrStr := eis.config.IndexerListenAddress var defaultNet *chaincfg.Params networkName := eis.config.NetworkName @@ -174,60 +189,90 @@ func (eis *EVMListenerService) transferToBtc(destAddrStr string, amount int64) e return err } - inputs := make([]btcjson.TransactionInput, 0, 10) - totalInputAmount := btcutil.Amount(0) - for _, unspentTx := range unspentTxs { - inputs = append(inputs, btcjson.TransactionInput{ - Txid: unspentTx.TxID, - Vout: unspentTx.Vout, - }) - totalInputAmount += btcutil.Amount(unspentTx.Amount * 1e8) - if (int64(totalInputAmount) + eis.config.Fee) > amount { - break - } - } - // eis.Logger.Info("ListUnspentMinMaxAddresses", "totalInputAmount", totalInputAmount) - changeAmount := int64(totalInputAmount) - eis.config.Fee - amount // fee - if changeAmount > 0 { - changeAddr, err := btcutil.DecodeAddress(sourceAddrStr, defaultNet) - if err != nil { - eis.Logger.Error("EVMListenerService transferToBtc DecodeAddress sourceAddress failed: ", "err", err) - return err - } - destAddr, err := btcutil.DecodeAddress(destAddrStr, defaultNet) + totalTransferAmount := btcutil.Amount(0) + tx := wire.NewMsgTx(wire.TxVersion) + + for index, destAddress := range destAddresses { + destAddr, err := btcutil.DecodeAddress(destAddress, defaultNet) if err != nil { eis.Logger.Error("EVMListenerService transferToBtc DecodeAddress destAddress failed: ", "err", err) return err } - outputs := map[btcutil.Address]btcutil.Amount{ - changeAddr: btcutil.Amount(changeAmount), - destAddr: btcutil.Amount(amount), - } - rawTx, err := eis.btcCli.CreateRawTransaction(inputs, outputs, nil) + destinationScript, err := txscript.PayToAddrScript(destAddr) if err != nil { - eis.Logger.Error("EVMListenerService transferToBtc CreateRawTransaction failed: ", "err", err) + eis.Logger.Error("EVMListenerService transferToBtc PayToAddrScript destAddress failed: ", "err", err) return err } + tx.AddTxOut(wire.NewTxOut(amounts[index], destinationScript)) + totalTransferAmount += btcutil.Amount(amounts[index]) + } - // sign - signedTx, complete, err := eis.btcCli.SignRawTransactionWithWallet(rawTx) + totalInputAmount := btcutil.Amount(0) + for _, unspentTx := range unspentTxs { + inTxid, err := chainhash.NewHashFromStr(unspentTx.TxID) if err != nil { - eis.Logger.Error("EVMListenerService transferToBtc SignRawTransactionWithWallet failed: ", "err", err) + eis.Logger.Error("EVMListenerService transferToBtc NewHashFromStr failed: ", "err", err) return err } - if !complete { - eis.Logger.Error("EVMListenerService transferToBtc SignRawTransactionWithWallet failed: ", "err", errors.New("SignRawTransaction not complete")) - return errors.New("SignRawTransaction not complete") - } - // send - txHash, err := eis.btcCli.SendRawTransaction(signedTx, true) - if err != nil { - eis.Logger.Error("EVMListenerService transferToBtc SendRawTransaction failed: ", "err", err) - return err + outpoint := wire.NewOutPoint(inTxid, unspentTx.Vout) + txIn := wire.NewTxIn(outpoint, nil, nil) + tx.AddTxIn(txIn) + totalInputAmount += btcutil.Amount(unspentTx.Amount * 1e8) + if int64(totalInputAmount) > (int64(totalTransferAmount) + eis.config.Fee) { + break } - eis.Logger.Info("EVMListenerService tx success: ", "from", sourceAddrStr, "to", destAddrStr, "amount", amount, "hash", txHash.String()) - return nil } - return errors.New("unable to calculate change amount") + changeAmount := int64(totalInputAmount) - eis.config.Fee - int64(totalTransferAmount) + if changeAmount < 0 { + return errors.New("insufficient balance") + } + changeScript, err := txscript.PayToAddrScript(sourceAddr) + if err != nil { + eis.Logger.Error("EVMListenerService transferToBtc PayToAddrScript sourceAddr failed: ", "err", err) + return err + } + tx.AddTxOut(wire.NewTxOut(changeAmount, changeScript)) + + // sign + signedTx, complete, err := eis.btcCli.SignRawTransactionWithWallet(tx) + if err != nil { + eis.Logger.Error("EVMListenerService transferToBtc SignRawTransactionWithWallet failed: ", "err", err) + return err + } + if !complete { + eis.Logger.Error("EVMListenerService transferToBtc SignRawTransactionWithWallet failed: ", "err", errors.New("SignRawTransaction not complete")) + return errors.New("SignRawTransaction not complete") + } + // send + txHash, err := eis.btcCli.SendRawTransaction(signedTx, true) + if err != nil { + eis.Logger.Error("EVMListenerService transferToBtc SendRawTransaction failed: ", "err", err) + return err + } + eis.Logger.Info("EVMListenerService tx success: ", "from", sourceAddrStr, "to", destAddresses, "amount", amounts, "hash", txHash.String()) + return nil +} + +func (eis *EVMListenerService) IsUnspentTX() (bool, error) { + sourceAddrStr := eis.config.IndexerListenAddress + var defaultNet *chaincfg.Params + networkName := eis.config.NetworkName + defaultNet = ChainParams(networkName) + + // get sourceAddress UTXO + sourceAddr, err := btcutil.DecodeAddress(sourceAddrStr, defaultNet) + if err != nil { + eis.Logger.Error("EVMListenerService IsUnspentTX DecodeAddress failed: ", "err", err) + return false, err + } + unspentTxs, err := eis.btcCli.ListUnspentMinMaxAddresses(1, 9999999, []btcutil.Address{sourceAddr}) + if err != nil { + eis.Logger.Error("EVMListenerService ListUnspentMinMaxAddresses transferToBtc DecodeAddress failed: ", "err", err) + return false, err + } + if len(unspentTxs) == 0 { + return false, nil + } + return true, nil } diff --git a/bitcoin/evm_listener_service_test.go b/bitcoin/evm_listener_service_test.go index 286bbc341c..659e041880 100644 --- a/bitcoin/evm_listener_service_test.go +++ b/bitcoin/evm_listener_service_test.go @@ -1,14 +1,13 @@ package bitcoin_test import ( - "fmt" + "errors" "log" "testing" "github.com/btcsuite/btcd/rpcclient" "github.com/ethereum/go-ethereum/ethclient" "github.com/evmos/ethermint/bitcoin" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -32,7 +31,7 @@ func TestNewEVMListenerService(t *testing.T) { }() // start eth rpc client - ethlient, err := ethclient.Dial(fmt.Sprintf("%s:%s", bitcoinCfg.Evm.RPCHost, bitcoinCfg.Evm.RPCPort)) + ethlient, err := ethclient.Dial(bitcoinCfg.Bridge.EthRPCURL) if err != nil { log.Fatalf("EVMListenerService failed to create eth client: %v", err) } @@ -41,5 +40,82 @@ func TestNewEVMListenerService(t *testing.T) { }() listenerService := bitcoin.NewEVMListenerService(btclient, ethlient, bitcoinCfg) - assert.NotNil(t, listenerService) + require.NotNil(t, listenerService) +} + +func TestIsUnspentTX(t *testing.T) { + listenerService := evmListenerWithConfig(t) + + testCase := []struct { + name string + value bool + }{ + { + name: "NoUnspentTX", + value: false, + }, + } + + for _, tc := range testCase { + t.Run(tc.name, func(t *testing.T) { + isOK, _ := listenerService.IsUnspentTX() + require.Equal(t, tc.value, isOK) + }) + } +} + +func TestTransferToBtc(t *testing.T) { + listenerService := evmListenerWithConfig(t) + + testCase := []struct { + name string + addresses []string + amounts []int64 + err error + }{ + { + name: "fail", + addresses: []string{"tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz"}, + amounts: []int64{10000}, + err: errors.New("the client has been shutdown"), + }, + } + + for _, tc := range testCase { + t.Run(tc.name, func(t *testing.T) { + err := listenerService.TransferToBtc(tc.addresses, tc.amounts) + if err != nil { + require.Error(t, tc.err, err) + } + }) + } +} + +func evmListenerWithConfig(t *testing.T) *bitcoin.EVMListenerService { + bitcoinCfg, err := bitcoin.LoadBitcoinConfig("./testdata") + require.NoError(t, err) + + // start btc rpc client + btclient, err := rpcclient.New(&rpcclient.ConnConfig{ + Host: bitcoinCfg.RPCHost + ":" + bitcoinCfg.RPCPort, + User: bitcoinCfg.RPCUser, + Pass: bitcoinCfg.RPCPass, + HTTPPostMode: true, // Bitcoin core only supports HTTP POST mode + DisableTLS: true, // Bitcoin core does not provide TLS by default + }, nil) + if err != nil { + log.Fatalf("EVMListenerService failed to create bitcoin client: %v", err) + } + + // start eth rpc client + ethlient, err := ethclient.Dial(bitcoinCfg.Bridge.EthRPCURL) + if err != nil { + log.Fatalf("EVMListenerService failed to create eth client: %v", err) + } + defer func() { + ethlient.Close() + }() + + listenerService := bitcoin.NewEVMListenerService(btclient, ethlient, bitcoinCfg) + return listenerService } diff --git a/bitcoin/testdata/bitcoin.toml b/bitcoin/testdata/bitcoin.toml index 6ee24be797..2991c00bde 100644 --- a/bitcoin/testdata/bitcoin.toml +++ b/bitcoin/testdata/bitcoin.toml @@ -7,7 +7,6 @@ wallet-name = "b2node" destination = "tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" enable-indexer = true indexer-listen-address = "tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv" -source-address = "tb1qr2ssscefkjeehv5kl0alhwj976v6cpxqlskn7n" fee = 200000 [bridge] @@ -21,9 +20,6 @@ aa-kernel-factory = "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF4" [evm] enable-listener = true -rpc-host = "http://127.0.0.1" -rpc-port = 8545 -contract-address = "0x47549F0f902F8E0DB96aBb16E06Da60751516F54" start-height = 0 deposit = "0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee88" withdraw = "0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add85" diff --git a/server/start.go b/server/start.go index cb837c7320..09e3967d4d 100644 --- a/server/start.go +++ b/server/start.go @@ -776,7 +776,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, opts StartOpt }() // start eth rpc client - ethlient, err := ethclient.Dial(fmt.Sprintf("%s:%s", bitcoinCfg.Evm.RPCHost, bitcoinCfg.Evm.RPCPort)) + ethlient, err := ethclient.Dial(bitcoinCfg.Bridge.EthRPCURL) if err != nil { logger.Error("EVMListenerService failed to create eth client", "error", err.Error()) return err From 4349385ff446b5f234f266a5a7a32a471ab055b8 Mon Sep 17 00:00:00 2001 From: robertcc Date: Wed, 20 Dec 2023 15:22:58 +0800 Subject: [PATCH 11/15] modify evm listener server --- bitcoin/config.go | 6 ------ bitcoin/evm_listener_service.go | 30 +++++++++++++++++++++++++++--- bitcoin/testdata/bitcoin.toml | 1 - server/start.go | 12 +++++++++++- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/bitcoin/config.go b/bitcoin/config.go index e7fb0fad6b..143da63f1b 100644 --- a/bitcoin/config.go +++ b/bitcoin/config.go @@ -83,8 +83,6 @@ type StateConfig struct { type EvmConfig struct { // EnableListener defines whether to enable the listener EnableListener bool `mapstructure:"enable-listener"` - // StartHeight defines the start height - StartHeight int64 `mapstructure:"start-height"` // Deposit defines the deposit event hash Deposit string `mapstructure:"deposit"` // Withdraw defines the withdraw event hash @@ -225,10 +223,6 @@ func LoadBitcoinConfig(homePath string) (*BitconConfig, error) { if err != nil { return nil, err } - err = v.BindEnv("evm.start-height", "BITCOIN_EVM_START_HEIGHT") - if err != nil { - return nil, err - } err = v.BindEnv("evm.deposit", "BITCOIN_EVM_DEPOSIT") if err != nil { return nil, err diff --git a/bitcoin/evm_listener_service.go b/bitcoin/evm_listener_service.go index 8a1f9f78e3..1b481a8516 100644 --- a/bitcoin/evm_listener_service.go +++ b/bitcoin/evm_listener_service.go @@ -24,6 +24,8 @@ import ( "strconv" "time" + dbm "github.com/tendermint/tm-db" + "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" @@ -43,6 +45,7 @@ import ( const ( ListenerServiceName = "EVMListenerService" + EVMListenerBlockKey = "EVMListenerBlock" // key: currentBlock ) // EVMListenerService indexes transactions for json-rpc service. @@ -52,6 +55,7 @@ type EVMListenerService struct { btcCli *btcrpcclient.Client ethCli *ethclient.Client config *BitconConfig + db dbm.DB } // NewEVMListenerService returns a new service instance. @@ -59,8 +63,9 @@ func NewEVMListenerService( btcCli *btcrpcclient.Client, ethCli *ethclient.Client, config *BitconConfig, + db dbm.DB, ) *EVMListenerService { - is := &EVMListenerService{btcCli: btcCli, ethCli: ethCli, config: config} + is := &EVMListenerService{btcCli: btcCli, ethCli: ethCli, config: config, db: db} is.BaseService = *service.NewBaseService(nil, ListenerServiceName, is) return is } @@ -68,7 +73,21 @@ func NewEVMListenerService( // OnStart implements service.Service by subscribing for new blocks // and indexing them by events. func (eis *EVMListenerService) OnStart() error { - lastBlock := eis.config.Evm.StartHeight + var lastBlock int64 + lastBlockByte, err := eis.db.Get([]byte(EVMListenerBlockKey)) + if err != nil { + eis.Logger.Error("EVMListenerService get block from db failed", "error", err) + return err + } + if string(lastBlockByte) == "" { + lastBlock = 0 + } else { + lastBlock, err = strconv.ParseInt(string(lastBlockByte), 10, 64) + if err != nil { + eis.Logger.Error("EVMListenerService get lastBlock failed", "error", err) + return err + } + } addresses := []common.Address{ common.HexToAddress(eis.config.Bridge.ContractAddress), } @@ -93,7 +112,7 @@ func (eis *EVMListenerService) OnStart() error { eis.Logger.Error("EVMListenerService ParseInt latestBlock", "err", err) return err } - eis.Logger.Info("EVMListenerService ethClient height", "height", latestBlock, "lastBlock", lastBlock, "destAddresses", destAddresses) + eis.Logger.Info("EVMListenerService ethClient height", "height", latestBlock, "lastBlock", lastBlock, "dest", destAddresses, "amout", amounts) if latestBlock <= lastBlock { time.Sleep(time.Second * 10) continue @@ -147,6 +166,11 @@ func (eis *EVMListenerService) OnStart() error { } } lastBlock = i + currentBlockStr := strconv.FormatInt(lastBlock, 10) + err = eis.db.Set([]byte(EVMListenerBlockKey), []byte(currentBlockStr)) + if err != nil { + eis.Logger.Error("EVMListenerService db set EVMListenerBlockKey failed: ", "err", err) + } if len(destAddresses) > 0 { isOK, err := eis.IsUnspentTX() if err != nil { diff --git a/bitcoin/testdata/bitcoin.toml b/bitcoin/testdata/bitcoin.toml index 2991c00bde..dae5cd31c0 100644 --- a/bitcoin/testdata/bitcoin.toml +++ b/bitcoin/testdata/bitcoin.toml @@ -20,7 +20,6 @@ aa-kernel-factory = "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DFF4" [evm] enable-listener = true -start-height = 0 deposit = "0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee88" withdraw = "0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add85" diff --git a/server/start.go b/server/start.go index 09e3967d4d..d08ea84553 100644 --- a/server/start.go +++ b/server/start.go @@ -785,7 +785,12 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, opts StartOpt ethlient.Close() }() - listenerService := bitcoin.NewEVMListenerService(btclient, ethlient, bitcoinCfg) + evmListenerDB, err := OpenEVMListenerServiceDB(home, server.GetAppDBBackend(ctx.Viper)) + if err != nil { + logger.Error("failed to open bitcoin indexer DB", "error", err.Error()) + return err + } + listenerService := bitcoin.NewEVMListenerService(btclient, ethlient, bitcoinCfg, evmListenerDB) listenerLogger := ctx.Logger.With("EVMListener", "evm") listenerService.SetLogger(listenerLogger) @@ -842,3 +847,8 @@ func startTelemetry(cfg config.Config) (*telemetry.Metrics, error) { } return telemetry.New(cfg.Telemetry) } + +func OpenEVMListenerServiceDB(rootDir string, backendType dbm.BackendType) (dbm.DB, error) { + dataDir := filepath.Join(rootDir, "data") + return dbm.NewDB("evmlistenerservice", backendType, dataDir) +} From 24fdb0fe652264e7f7df8232511950e18ba2da83 Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 22 Dec 2023 14:05:07 +0800 Subject: [PATCH 12/15] modify lint check --- .env.bitcoin | 54 ++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/.env.bitcoin b/.env.bitcoin index 13e733090a..c11508e084 100644 --- a/.env.bitcoin +++ b/.env.bitcoin @@ -1,33 +1,29 @@ -BITCOIN_NETWORK_NAME="testnet" -BITCOIN_RPC_HOST="127.0.0.1" -BITCOIN_RPC_PORT="8888" -BITCOIN_RPC_USER="test" -BITCOIN_RPC_PASS="123456" -BITCOIN_WALLET_NAME="test" -BITCOIN_DESTINATION="tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv" -BITCOIN_ENABLE_INDEXER="false" -BITCOIN_INDEXER_LISTEN_ADDRESS="tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz" -BITCOIN_BRIDGE_ETH_RPC_URL="127.0.0.1:8545" -BITCOIN_BRIDGE_CONTRACT_ADDRESS="0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF22" -BITCOIN_BRIDGE_ETH_PRIV_KEY="" -BITCOIN_BRIDGE_ABI="aaa.abi" -BITCOIN_BRIDGE_GAS_LIMIT="23333" +BITCOIN_BRIDGE_AA_KERNEL_FACTORY=0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF25 +BITCOIN_BRIDGE_AA_SCA_REGISTRY=0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF24 +BITCOIN_BRIDGE_ABI=aaa.abi +BITCOIN_BRIDGE_CONTRACT_ADDRESS=0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF22 +BITCOIN_BRIDGE_ETH_PRIV_KEY= +BITCOIN_BRIDGE_ETH_RPC_URL=127.0.0.1:8545 +BITCOIN_BRIDGE_GAS_LIMIT=23333 +BITCOIN_DESTINATION=tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv BITCOIN_ENABLE_COMMITTER=false -BITCOIN_STATE_HOST="localhost" -BITCOIN_STATE_PORT="5432" -BITCOIN_STATE_USER="user" -BITCOIN_STATE_PASS="password" -BITCOIN_STATE_DB_NAME="db" -BITCOIN_BRIDGE_AA_SCA_REGISTRY="0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF24" -BITCOIN_BRIDGE_AA_KERNEL_FACTORY="0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF25" +BITCOIN_ENABLE_INDEXER=false +BITCOIN_EVM_CONTRACT_ADDRESS=0x3c950C4D15311dB39F85441316983b3845396C6e +BITCOIN_EVM_DEPOSIT=0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee89 BITCOIN_EVM_ENABLE_LISTENER=false -BITCOIN_EVM_RPC_HOST="http://127.0.0.1" +BITCOIN_EVM_RPC_HOST=http://127.0.0.1 BITCOIN_EVM_RPC_PORT=8123 -BITCOIN_EVM_CONTRACT_ADDRESS="0x3c950C4D15311dB39F85441316983b3845396C6e" BITCOIN_EVM_START_HEIGHT=0 -BITCOIN_EVM_DEPOSIT="0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee89" -BITCOIN_EVM_WITHDRAW="0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add86" - - - - +BITCOIN_EVM_WITHDRAW=0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add86 +BITCOIN_INDEXER_LISTEN_ADDRESS=tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz +BITCOIN_NETWORK_NAME=testnet +BITCOIN_RPC_HOST=127.0.0.1 +BITCOIN_RPC_PASS=123456 +BITCOIN_RPC_PORT=8888 +BITCOIN_RPC_USER=test +BITCOIN_STATE_DB_NAME=db +BITCOIN_STATE_HOST=localhost +BITCOIN_STATE_PASS=password +BITCOIN_STATE_PORT=5432 +BITCOIN_STATE_USER=user +BITCOIN_WALLET_NAME=test \ No newline at end of file From c1a8a6dd4197a131845809ccf46fc8095314f9ee Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 22 Dec 2023 14:11:34 +0800 Subject: [PATCH 13/15] modify lint check --- .env.bitcoin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.bitcoin b/.env.bitcoin index c11508e084..e1f51c0c58 100644 --- a/.env.bitcoin +++ b/.env.bitcoin @@ -26,4 +26,4 @@ BITCOIN_STATE_HOST=localhost BITCOIN_STATE_PASS=password BITCOIN_STATE_PORT=5432 BITCOIN_STATE_USER=user -BITCOIN_WALLET_NAME=test \ No newline at end of file +BITCOIN_WALLET_NAME=test From 2b8b0aac424db5285180617b5c11bd07e53a36c7 Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 22 Dec 2023 14:48:45 +0800 Subject: [PATCH 14/15] modify bitcoin env --- .env.bitcoin | 8 ++++---- bitcoin/config_test.go | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.env.bitcoin b/.env.bitcoin index e1f51c0c58..f279e78707 100644 --- a/.env.bitcoin +++ b/.env.bitcoin @@ -8,12 +8,8 @@ BITCOIN_BRIDGE_GAS_LIMIT=23333 BITCOIN_DESTINATION=tb1qfhhxljfajcppfhwa09uxwty5dz4xwfptnqmvtv BITCOIN_ENABLE_COMMITTER=false BITCOIN_ENABLE_INDEXER=false -BITCOIN_EVM_CONTRACT_ADDRESS=0x3c950C4D15311dB39F85441316983b3845396C6e BITCOIN_EVM_DEPOSIT=0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee89 BITCOIN_EVM_ENABLE_LISTENER=false -BITCOIN_EVM_RPC_HOST=http://127.0.0.1 -BITCOIN_EVM_RPC_PORT=8123 -BITCOIN_EVM_START_HEIGHT=0 BITCOIN_EVM_WITHDRAW=0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add86 BITCOIN_INDEXER_LISTEN_ADDRESS=tb1qgm39cu009lyvq93afx47pp4h9wxq5x92lxxgnz BITCOIN_NETWORK_NAME=testnet @@ -27,3 +23,7 @@ BITCOIN_STATE_PASS=password BITCOIN_STATE_PORT=5432 BITCOIN_STATE_USER=user BITCOIN_WALLET_NAME=test + + + + diff --git a/bitcoin/config_test.go b/bitcoin/config_test.go index af7c2ed7bf..84eb601c13 100644 --- a/bitcoin/config_test.go +++ b/bitcoin/config_test.go @@ -72,10 +72,6 @@ func TestConfigEnv(t *testing.T) { os.Setenv("BITCOIN_BRIDGE_AA_SCA_REGISTRY", "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF23") os.Setenv("BITCOIN_BRIDGE_AA_KERNEL_FACTORY", "0xB457BF68D71a17Fa5030269Fb895e29e6cD2DF24") os.Setenv("BITCOIN_EVM_ENABLE_LISTENER", "false") - os.Setenv("BITCOIN_EVM_RPC_HOST", "http://127.0.0.1") - os.Setenv("BITCOIN_EVM_RPC_PORT", "8123") - os.Setenv("BITCOIN_EVM_CONTRACT_ADDRESS", "0x3c950C4D15311dB39F85441316983b3845396C6d") - os.Setenv("BITCOIN_EVM_START_HEIGHT", "0") os.Setenv("BITCOIN_EVM_DEPOSIT", "0x01bee1bfa4116bd0440a1108ef6cb6a2f6eb9b611d8f53260aec20d39e84ee88") os.Setenv("BITCOIN_EVM_WITHDRAW", "0xda335c6ae73006d1145bdcf9a98bc76d789b653b13fe6200e6fc4c5dd54add85") From 592d355d471a079e7fe02e132b77e8d7925c96de Mon Sep 17 00:00:00 2001 From: robertcc Date: Fri, 22 Dec 2023 15:43:24 +0800 Subject: [PATCH 15/15] modify abi.json --- bitcoin/testdata/abi.json | 91 ++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 34 deletions(-) diff --git a/bitcoin/testdata/abi.json b/bitcoin/testdata/abi.json index cc822de7b1..dcda47bba9 100644 --- a/bitcoin/testdata/abi.json +++ b/bitcoin/testdata/abi.json @@ -1,35 +1,4 @@ [ - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, { "anonymous": false, "inputs": [ @@ -60,9 +29,9 @@ "inputs": [ { "indexed": false, - "internalType": "uint64", + "internalType": "uint8", "name": "version", - "type": "uint64" + "type": "uint8" } ], "name": "Initialized", @@ -212,6 +181,29 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "deposit_uuid", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "b2_to_address", + "type": "address" + }, + { + "internalType": "uint256", + "name": "btc_amount", + "type": "uint256" + } + ], + "name": "depositV2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -289,7 +281,7 @@ }, { "internalType": "address", - "name": "callerConfirmation", + "name": "account", "type": "address" } ], @@ -335,6 +327,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, { "inputs": [ { @@ -348,6 +353,24 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "withdraw_uuid", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "btc_address", + "type": "string" + } + ], + "name": "withdrawV2", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, { "stateMutability": "payable", "type": "receive"