From 9ad66cf67ed4ea573e746f4cddd4213e3310f856 Mon Sep 17 00:00:00 2001 From: "minmin.yan" Date: Fri, 18 Aug 2023 16:21:33 +0800 Subject: [PATCH 1/3] upgrade eth sign --- coins/aptos/go.mod | 10 ++ coins/bitcoin/go.mod | 26 ++++ coins/cosmos/go.mod | 26 ++++ coins/ethereum/api.go | 240 +++++++++++++++++++++++++++++ coins/ethereum/api_test.go | 93 +++++++++++ coins/ethereum/common.go | 53 +++++++ coins/ethereum/errors.go | 7 + coins/ethereum/eth.go | 15 +- coins/ethereum/eth_test.go | 1 - coins/ethereum/go.mod | 24 +++ coins/ethereum/types.go | 70 +++++++++ coins/filecoin/go.mod | 19 +++ coins/near/go.mod | 17 ++ coins/polkadot/go.mod | 14 ++ coins/polkadot/transaction.go | 4 +- coins/solana/go.mod | 13 ++ coins/stacks/go.mod | 18 +++ coins/starknet/account.go | 4 +- coins/starknet/account_test.go | 4 +- coins/starknet/go.mod | 15 ++ coins/starknet/transaction_test.go | 8 +- coins/sui/go.mod | 16 ++ coins/tron/go.mod | 18 +++ crypto/go.mod | 21 +++ util/go.mod | 7 + util/hex.go | 20 +++ util/int.go | 8 + 27 files changed, 756 insertions(+), 15 deletions(-) create mode 100644 coins/aptos/go.mod create mode 100644 coins/bitcoin/go.mod create mode 100644 coins/cosmos/go.mod create mode 100644 coins/ethereum/api.go create mode 100644 coins/ethereum/api_test.go create mode 100644 coins/ethereum/common.go create mode 100644 coins/ethereum/errors.go create mode 100644 coins/ethereum/go.mod create mode 100644 coins/ethereum/types.go create mode 100644 coins/filecoin/go.mod create mode 100644 coins/near/go.mod create mode 100644 coins/polkadot/go.mod create mode 100644 coins/solana/go.mod create mode 100644 coins/stacks/go.mod create mode 100644 coins/starknet/go.mod create mode 100644 coins/sui/go.mod create mode 100644 coins/tron/go.mod create mode 100644 crypto/go.mod create mode 100644 util/go.mod create mode 100644 util/int.go diff --git a/coins/aptos/go.mod b/coins/aptos/go.mod new file mode 100644 index 0000000..c814dc0 --- /dev/null +++ b/coins/aptos/go.mod @@ -0,0 +1,10 @@ +module github.com/okx/go-wallet-sdk/coins/aptos + +go 1.19 + +require ( + github.com/okx/go-wallet-sdk/crypto v0.0.2 + golang.org/x/crypto v0.12.0 +) + +require golang.org/x/sys v0.11.0 // indirect diff --git a/coins/bitcoin/go.mod b/coins/bitcoin/go.mod new file mode 100644 index 0000000..5319ff4 --- /dev/null +++ b/coins/bitcoin/go.mod @@ -0,0 +1,26 @@ +module github.com/okx/go-wallet-sdk/coins/bitcoin + +go 1.19 + +require ( + github.com/btcsuite/btcd v0.23.4 + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/btcsuite/btcd/btcutil v1.1.3 + github.com/btcsuite/btcd/btcutil/psbt v1.1.8 + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 + github.com/stretchr/testify v1.8.4 + github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/util v0.0.2 +) + +require ( + github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect + github.com/btcsuite/btcutil v1.0.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/sys v0.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/cosmos/go.mod b/coins/cosmos/go.mod new file mode 100644 index 0000000..4fa202d --- /dev/null +++ b/coins/cosmos/go.mod @@ -0,0 +1,26 @@ +module github.com/okx/go-wallet-sdk/coins/cosmos + +go 1.19 + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/btcsuite/btcd/btcutil v1.1.3 + github.com/ethereum/go-ethereum v1.12.2 + github.com/stretchr/testify v1.8.4 + github.com/tyler-smith/go-bip39 v1.1.0 + github.com/okx/go-wallet-sdk/crypto v0.0.2 + golang.org/x/crypto v0.12.0 +) + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd v0.23.0 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + golang.org/x/sys v0.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/ethereum/api.go b/coins/ethereum/api.go new file mode 100644 index 0000000..3274823 --- /dev/null +++ b/coins/ethereum/api.go @@ -0,0 +1,240 @@ +package ethereum + +import ( + "encoding/hex" + "encoding/json" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" + "github.com/okx/go-wallet-sdk/coins/ethereum/token" + "github.com/okx/go-wallet-sdk/util" + "golang.org/x/crypto/sha3" + "math/big" +) + +// generate tx with json param +func GenerateTxWithJSON(message string, chainId *big.Int, isToken bool) (*UnsignedTx, error) { + var jsonTx Eip1559Token + err := json.Unmarshal([]byte(message), &jsonTx) + if err != nil { + return nil, err + } + // read chainId, Use the incoming chain id first + if len(jsonTx.ChainId) > 0 { + newChainId, ok := new(big.Int).SetString(jsonTx.ChainId, 10) + if ok { + chainId = newChainId + } + } + // Generate transaction object + // token logic + var data []byte + var toAddress common.Address + if isToken { + data, err = token.Transfer(jsonTx.To, util.ConvertToBigInt(jsonTx.Amount)) + if err != nil { + return nil, err + } + toAddress = common.HexToAddress(jsonTx.ContractAddress) + } else { + data = util.RemoveZeroHex(jsonTx.Data) + toAddress = common.HexToAddress(jsonTx.To) + } + if jsonTx.TxType == types.DynamicFeeTxType { // EIP1559 sign + tx := NewEip1559Transaction( + chainId, + util.ConvertToUint64(jsonTx.Nonce), + util.ConvertToBigInt(jsonTx.MaxPriorityFeePerGas), + util.ConvertToBigInt(jsonTx.MaxFeePerGas), + util.ConvertToUint64(jsonTx.GasLimit), + &toAddress, + util.ConvertToBigInt(jsonTx.Value), + data, + ) + res, err := tx.MarshalBinary() + if err != nil { + return nil, err + } + hash := tx.Hash() + return &UnsignedTx{Hash: hash.Hex(), Tx: util.EncodeHexWith0x(res)}, nil + } else { + // Token processing + var tx *EthTransaction + if isToken { + tx = NewEthTransaction(util.ConvertToBigInt(jsonTx.Nonce), util.ConvertToBigInt(jsonTx.GasLimit), util.ConvertToBigInt(jsonTx.GasPrice), big.NewInt(0), jsonTx.ContractAddress, util.EncodeHexWith0x(data)) + } else { + tx = NewEthTransaction(util.ConvertToBigInt(jsonTx.Nonce), util.ConvertToBigInt(jsonTx.GasLimit), util.ConvertToBigInt(jsonTx.GasPrice), util.ConvertToBigInt(jsonTx.Value), jsonTx.To, util.EncodeHexWith0x(data)) + } + hash, res, err := tx.GetSigningHash(chainId) + if err != nil { + return nil, err + } + return &UnsignedTx{Tx: res, Hash: hash}, nil + } +} + +// Generate the transaction to be broadcast based on the unsigned transaction and the signature result +func GenerateRawTransactionWithSignature(txType int, chainId, unsignedRawTx, r, s, v string) (string, error) { + unsignedRawTxByte := util.RemoveZeroHex(unsignedRawTx) + chainID, ok := new(big.Int).SetString(chainId, 10) + if !ok { + return "", ErrInvalidParam + } + R, ok := new(big.Int).SetString(r, 16) + if !ok { + return "", ErrInvalidParam + } + S, ok := new(big.Int).SetString(s, 16) + if !ok { + return "", ErrInvalidParam + } + V, ok := new(big.Int).SetString(v, 16) + if !ok { + return "", ErrInvalidParam + } + + if txType == types.DynamicFeeTxType { // EIP1559 sign + tx, err := generateEIP1559Tx(unsignedRawTx) + if err != nil { + return "", err + } + signer := types.NewLondonSigner(chainID) + signedTx, err := tx.WithSignature(signer, encodeRSV(R, S, V)) + if err != nil { + return "", err + } + rawTx, err := signedTx.MarshalBinary() + if err != nil { + return "", err + } + return util.EncodeHexWith0x(rawTx), err + } else { // legacy sign + var tx EthTransaction + if err := rlp.DecodeBytes(unsignedRawTxByte, &tx); err != nil { + return "", err + } + tx.V = V + tx.R = R + tx.S = S + value, err := rlp.EncodeToBytes(tx) + if err != nil { + return "", err + } + return util.EncodeHexWith0x(value), err + } +} + +func CalTxHash(rawTx string) string { + bytes := util.RemoveZeroHex(rawTx) + s256 := sha3.NewLegacyKeccak256() + s256.Write(bytes) + txBytes := s256.Sum(nil) + return util.EncodeHexWith0x(txBytes) +} + +func DecodeTx(rawTx string) (string, error) { + rawTxBytes := util.RemoveZeroHex(rawTx) + tx := new(types.Transaction) + if err := tx.UnmarshalBinary(rawTxBytes); err != nil { + return "", err + } + txData := make(map[string]interface{}) + txData["nonce"] = big.NewInt(int64(tx.Nonce())) + txData["gasLimit"] = float64(tx.Gas()) + txData["to"] = tx.To().String() + txData["value"] = float64(tx.Value().Int64()) + txData["chainId"] = tx.ChainId() + txData["txType"] = int(tx.Type()) + if tx.Type() == types.DynamicFeeTxType { + txData["maxFeePerGas"] = float64(tx.GasFeeCap().Int64()) + txData["maxPriorityFeePerGas"] = float64(tx.GasTipCap().Int64()) + } else { + txData["gasPrice"] = float64(tx.GasPrice().Int64()) + } + signer := types.NewLondonSigner(tx.ChainId()) + if addr, err := types.Sender(signer, tx); err == nil { + txData["from"] = addr.String() + } + v, r, s := tx.RawSignatureValues() + txData["v"] = v + txData["r"] = r + txData["s"] = s + if len(tx.Data()) != 0 { + data := hex.EncodeToString(tx.Data()) + txData["inputData"] = "0x" + data + inputData := make(map[string]interface{}) + if len(data) >= 72 { + methodId := data[:8] + approveMethod := "approve(address,uint256)" + transferMethod := "transfer(address,uint256)" + approveMethodId := hex.EncodeToString(crypto.Keccak256([]byte("approve(address,uint256)")))[:8] + transferMethodId := hex.EncodeToString(crypto.Keccak256([]byte("transfer(address,uint256)")))[:8] + address := "0x" + data[32:72] + amount, ok := new(big.Int).SetString(data[72:], 16) + if !ok { + return "", ErrInvalidParam + } + if methodId == approveMethodId { + inputData["method"] = approveMethod + inputData["address"] = address + inputData["amount"] = amount + } else if methodId == transferMethodId { + inputData["method"] = transferMethod + inputData["address"] = address + inputData["amount"] = amount + } + } + txData["decodedData"] = inputData + } + b, err := json.Marshal(txData) + return string(b), err +} + +func EcRecover(signature, message string, addPrefix bool) string { + signatureData := util.RemoveZeroHex(signature) + R := signatureData[:32] + S := signatureData[32:64] + V := signatureData[64:65] + var err error + realData, _ := hex.DecodeString(hex.EncodeToString(V) + hex.EncodeToString(R) + hex.EncodeToString(S)) + var hash []byte + if addPrefix { + hash = calMessageHash(message) + } else { + hash, err = util.DecodeHexString(message) + if err != nil { + return "" + } + } + publicKey, _, err := ecdsa.RecoverCompact(realData, hash) + if err != nil { + return "" + } + return util.EncodeHexWith0x(getEthGroupPubHash(publicKey)[12:]) +} + +func GetAddress(pubkeyHex string) string { + p, err := util.DecodeHexString(pubkeyHex) + if err != nil { + return "" + } + pubkey, err := btcec.ParsePubKey(p) + if err != nil { + return "" + } + return util.EncodeHexWith0x(getEthGroupPubHash(pubkey)[12:]) +} + +func ValidateAddress(address string) bool { + if util.HasHexPrefix(address) { + address = address[2:] + } + return len(address) == 2*AddressLength && util.IsHex(address) +} + +func MessageHash(data string) string { + return util.EncodeHexWith0x(calMessageHash(data)) +} diff --git a/coins/ethereum/api_test.go b/coins/ethereum/api_test.go new file mode 100644 index 0000000..e9dc69c --- /dev/null +++ b/coins/ethereum/api_test.go @@ -0,0 +1,93 @@ +package ethereum + +import ( + "encoding/hex" + "fmt" + "github.com/stretchr/testify/assert" + "github.com/okx/go-wallet-sdk/util" + "math/big" + "testing" +) + +func TestDecodeTx(t *testing.T) { + r, err := DecodeTx("0xf86c81f48504a817c8008252089431c514837ee0f6062eaffb0882d764170a17800487038d7ea4c680008025a08d2cce871494c89cc0057b75ebe7ba5fcb0ca12376f8b7c3b5e1ee0bce77c2a2a028bdf0d6d9e52f50b2eecb6c21aeb288e4727478b2f588c9d0787e845cc95144") + if err != nil { + t.Fatal(err) + } + assert.Equal(t, `{"chainId":1,"from":"0x05d132975D8EfCD67262980C54f9030319C91Af0","gasLimit":21000,"gasPrice":20000000000,"nonce":244,"r":63855278322598500466154057791001702486226441534857140050433689054814601200290,"s":18428110250072635139397296879143057669157476180829444102104539880782742245700,"to":"0x31C514837ee0f6062EafFb0882D764170A178004","txType":0,"v":37,"value":1000000000000000}`, r) +} + +func TestMessageHash(t *testing.T) { + r := MessageHash("data") + fmt.Println(r) + assert.Equal(t, "0x8edd100985b029cc35de22b18d970ad826ca8948fc18e6f4783f4728af80b113", r) +} + +func TestEcRecover(t *testing.T) { + validRes := EcRecover("25064ca2f492d0a8a99801e57e5f30fc6c69335e02487d652dc98448145866556007ddc34a0ccdce592176f022e05d3e83b83a039d97aae86c1c7839cb44221e1b", "data", true) + fmt.Println(validRes) + assert.Equal(t, "0xdcab8e02b4d06d0a07ddb1dfa6e2c94cf2da2356", validRes) + + res := EcRecover("0xb715378a9d1cce098c27399f40e408fe1ac314aac8ced9704905f14d0d6840c7027fdfffb800958ba826ecbdcc411571af9a348e2a78166b3f8518ce77b35c701b", "0x214f333f99d572b10721be1024700ba551b1b18ecd9072c2975cc82da63cc631", false) + fmt.Println(res) + assert.Equal(t, "0xb8cf89fa8f3a0ddcda3d8fdb9006859628665ef4", res) +} + +func TestGetAddress(t *testing.T) { + validRes := GetAddress("0x04dcb83211f9cbc7f846595d93613f395fa410ca9bc1ae6ac4cbc5c63c66fc83c599dcdf22033d8a833d28a7f88da8c0d4d25ded358623068f4f2a07bdcb8d6d2c") + fmt.Println(validRes) + assert.Equal(t, "0x769ecd386d4ad9d7f7aea69f674e39efe7ea0720", validRes) +} + +func TestValidateAddress(t *testing.T) { + assert.Equal(t, true, ValidateAddress("0x769ecd386d4ad9d7f7aea69f674e39efe7ea0720")) + assert.Equal(t, false, ValidateAddress("0x769ecd386d4ad9d7f7aea69f674e139ef3e7ea0720")) +} + +func TestGenerateRawTransactionWithSignature(t *testing.T) { + unsignedRawTx := "eb808505d21dba0082520894917ce722ac0b323c038e141eec7bd6bf5a00c6ac87017056cdfb974a80388080" + r := "6fd922e7bbd9796cc49827f0b9645adfc34a16017e316e8c0b3062270b1a15bc" + s := "685a42b37c414aa0fca332f87c1f566f59065e88f3efdaac74f2739f5788d615" + v := "93" + rr, err := GenerateRawTransactionWithSignature(0, "56", unsignedRawTx, r, s, v) + if err != nil { + t.Fatal(err) + } + fmt.Println(rr) + assert.Equal(t, "0xf86c808505d21dba0082520894917ce722ac0b323c038e141eec7bd6bf5a00c6ac87017056cdfb974a808193a06fd922e7bbd9796cc49827f0b9645adfc34a16017e316e8c0b3062270b1a15bca0685a42b37c414aa0fca332f87c1f566f59065e88f3efdaac74f2739f5788d615", rr) +} + +func TestGenerateTxWithJSON(t *testing.T) { + raw := `{"to":"","value":"404993102026570","fee":"100000", "data":"0x123123123123","gasPrice":"20000000000","gasLimit":"21000"}` + tx, err := GenerateTxWithJSON(raw, big.NewInt(1), false) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "dd808504a817c8008252088087017056cdfb974a86123123123123018080", tx.Tx) + raw = `{ + "txType":2, + "nonce":"244", + "to":"0x31c514837ee0f6062eaffb0882d764170a178004", + "value":"1000000000000000", + "gasLimit":"21000", + "maxFeePerGas":"20000000000", + "maxPriorityFeePerGas":"1500000000" + }` + tx, err = GenerateTxWithJSON(raw, big.NewInt(1), false) + if err != nil { + t.Fatal(err) + } + fmt.Println(tx.Tx, tx.Hash) + assert.Equal(t, "0x02f30181f48459682f008504a817c8008252089431c514837ee0f6062eaffb0882d764170a17800487038d7ea4c6800080c0808080", tx.Tx) + assert.Equal(t, "0xbf498de3f0bc5fff92798a26f91f0a44842cf4471504de23e2eec80d53d65ad7", tx.Hash) +} + +func TestBigint(t *testing.T) { + r, _ := util.DecodeHexString("0x02f30181f48459682f008504a817c8008252089431c514837ee0f6062eaffb0882d764170a17800487038d7ea4c6800080c0808080") + rr := new(big.Int).SetBytes(r) + fmt.Println(hex.EncodeToString(rr.Bytes())) + fmt.Println(rr.String()) + bb, ok := new(big.Int).SetString("02f30181f48459682f008504a817c8008252089431c514837ee0f6062eaffb0882d764170a17800487038d7ea4c6800080c0808080", 16) + + fmt.Println(ok, hex.EncodeToString(bb.Bytes())) +} diff --git a/coins/ethereum/common.go b/coins/ethereum/common.go new file mode 100644 index 0000000..39dba7b --- /dev/null +++ b/coins/ethereum/common.go @@ -0,0 +1,53 @@ +package ethereum + +import ( + "encoding/hex" + "fmt" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" + "math/big" +) + +const AddressLength = 20 + +func encodeRSV(r, s, v *big.Int) []byte { + sig := make([]byte, 65) + copy(sig[0:32], r.Bytes()) + copy(sig[32:64], s.Bytes()) + sig[64] = byte(v.Uint64() - 27) + return sig +} + +func getEthGroupPubHash(pubKey *btcec.PublicKey) []byte { + pubBytes := pubKey.SerializeUncompressed() + hash := sha3.NewLegacyKeccak256() + hash.Write(pubBytes[1:]) + addressByte := hash.Sum(nil) + return addressByte +} + +func generateEIP1559Tx(rlpStr string) (*types.Transaction, error) { + tx := new(Eip1559Transaction) + if len(rlpStr) > 1 { + if rlpStr[0:2] == "02" { + rlpStr = rlpStr[2:] + } + } + unsignedByte, err := hex.DecodeString(rlpStr) + if err != nil { + return nil, err + } + if err = rlp.DecodeBytes(unsignedByte, &tx); err != nil { + return nil, err + } + return NewEip1559Transaction(tx.ChainId, tx.Nonce, tx.GasTipCap, tx.GasFeeCap, tx.Gas, tx.To, tx.Value, tx.Data), nil +} + +func calMessageHash(data string) []byte { + msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data) + s := sha3.NewLegacyKeccak256() + s.Write([]byte(msg)) + return s.Sum(nil) +} diff --git a/coins/ethereum/errors.go b/coins/ethereum/errors.go new file mode 100644 index 0000000..6d1253a --- /dev/null +++ b/coins/ethereum/errors.go @@ -0,0 +1,7 @@ +package ethereum + +import "errors" + +var ( + ErrInvalidParam = errors.New("invalid param") +) diff --git a/coins/ethereum/eth.go b/coins/ethereum/eth.go index 62e0de6..0038179 100644 --- a/coins/ethereum/eth.go +++ b/coins/ethereum/eth.go @@ -3,7 +3,6 @@ package ethereum import ( "encoding/hex" "fmt" - "github.com/btcsuite/btcd/btcec/v2" "math/big" "github.com/btcsuite/btcd/btcec/v2/ecdsa" @@ -51,7 +50,7 @@ func (tx *EthTransaction) SignTransaction(chainId *big.Int, prvKey *btcec.Privat if err != nil { return "", err } - return "0x" + hex.EncodeToString(value), nil + return util.EncodeHexWith0x(value), nil } func (tx *EthTransaction) UnSignedTx(chainId *big.Int) (string, error) { @@ -94,7 +93,7 @@ func (tx *EthTransaction) SignedTx(chainId *big.Int, sig *SignatureData) (string if err != nil { return "", err } - return "0x" + hex.EncodeToString(value), nil + return util.EncodeHexWith0x(value), nil } func SignMessage(message []byte, prvKey *btcec.PrivateKey) (*SignatureData, error) { @@ -115,7 +114,15 @@ func NewEthTransaction(nonce, gasLimit, gasPrice, value *big.Int, to, data strin Value: value, Data: dataBytes, } +} +func NewUnsignedTx(nonce, gasLimit, gasPrice, value, chainId *big.Int, to, data string) (*UnsignedTx, error) { + tx := NewEthTransaction(nonce, gasLimit, gasPrice, value, to, data) + data, hash, err := tx.GetSigningHash(chainId) + if err != nil { + return nil, err + } + return &UnsignedTx{Tx: data, Hash: hash}, nil } func NewTransactionFromRaw(raw string) (*EthTransaction, error) { @@ -202,7 +209,7 @@ func GetNewAddress(pubKey *btcec.PublicKey) string { hash := sha3.NewLegacyKeccak256() hash.Write(pubBytes[1:]) addressByte := hash.Sum(nil) - return "0x" + hex.EncodeToString(addressByte[12:]) + return util.EncodeHexWith0x(addressByte[12:]) } func GetEthereumMessagePrefix(message string) string { diff --git a/coins/ethereum/eth_test.go b/coins/ethereum/eth_test.go index b50c8fa..3d6aba4 100644 --- a/coins/ethereum/eth_test.go +++ b/coins/ethereum/eth_test.go @@ -3,7 +3,6 @@ package ethereum import ( "encoding/hex" "fmt" - "github.com/btcsuite/btcd/btcec/v2" "math/big" "testing" diff --git a/coins/ethereum/go.mod b/coins/ethereum/go.mod new file mode 100644 index 0000000..2c2c830 --- /dev/null +++ b/coins/ethereum/go.mod @@ -0,0 +1,24 @@ +module github.com/okx/go-wallet-sdk/coins/ethereum + +go 1.19 + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/ethereum/go-ethereum v1.12.2 + github.com/stretchr/testify v1.8.1 + github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/util v0.0.2 + golang.org/x/crypto v0.12.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/sys v0.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/okx/go-wallet-sdk/util => ../../util diff --git a/coins/ethereum/types.go b/coins/ethereum/types.go new file mode 100644 index 0000000..e9e5c34 --- /dev/null +++ b/coins/ethereum/types.go @@ -0,0 +1,70 @@ +package ethereum + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "math/big" +) + +type UnsignedTx struct { + Tx string `json:"tx"` + Hash string `json:"hash"` +} + +type Eip1559Transaction struct { + ChainId *big.Int `json:"chainId"` + Nonce uint64 `json:"nonce"` + GasTipCap *big.Int `json:"gasTipCap"` + GasFeeCap *big.Int `json:"gasFeeCap"` + Gas uint64 `json:"gas"` + To *common.Address `json:"to"` + Value *big.Int `json:"value"` + Data []byte `json:"data"` + AccessList types.AccessList `json:"accessList"` +} + +func NewEip1559Transaction( + chainId *big.Int, + nonce uint64, + maxPriorityFeePerGas *big.Int, + maxFeePerGas *big.Int, + gasLimit uint64, + to *common.Address, + value *big.Int, + data []byte) *types.Transaction { + return types.NewTx(&types.DynamicFeeTx{ + ChainID: chainId, + Nonce: nonce, + GasTipCap: maxPriorityFeePerGas, + GasFeeCap: maxFeePerGas, + Gas: gasLimit, + To: to, + Value: value, + Data: data, + }) +} + +type Eip1559Token struct { + EIP1559Transaction + ContractAddress string `json:"contract_address"` //合约地址 + Amount string `json:"amount"` //金额 +} + +type Transaction struct { + Nonce string `json:"nonce"` + GasLimit string `json:"gasLimit"` + GasPrice string `json:"gasPrice"` + From string `json:"from"` + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Fee string `json:"fee"` + ChainId string `json:"chainId"` +} + +type EIP1559Transaction struct { + Transaction + TxType int `json:"txType"` + MaxFeePerGas string `json:"maxFeePerGas"` + MaxPriorityFeePerGas string `json:"maxPriorityFeePerGas"` +} diff --git a/coins/filecoin/go.mod b/coins/filecoin/go.mod new file mode 100644 index 0000000..31a8c03 --- /dev/null +++ b/coins/filecoin/go.mod @@ -0,0 +1,19 @@ +module github.com/okx/go-wallet-sdk/coins/filecoin + +go 1.19 + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/dchest/blake2b v1.0.0 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 + github.com/fxamacker/cbor v1.5.1 + github.com/stretchr/testify v1.8.4 + github.com/okx/go-wallet-sdk/util v0.0.2 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/near/go.mod b/coins/near/go.mod new file mode 100644 index 0000000..04f6909 --- /dev/null +++ b/coins/near/go.mod @@ -0,0 +1,17 @@ +module github.com/okx/go-wallet-sdk/coins/near + +go 1.19 + +require ( + github.com/shopspring/decimal v1.3.1 + github.com/stretchr/testify v1.8.4 + github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/util v0.0.2 +) + +require ( + github.com/btcsuite/btcutil v1.0.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/polkadot/go.mod b/coins/polkadot/go.mod new file mode 100644 index 0000000..c55f866 --- /dev/null +++ b/coins/polkadot/go.mod @@ -0,0 +1,14 @@ +module github.com/okx/go-wallet-sdk/coins/polkadot + +go 1.19 + +require ( + github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/util v0.0.2 +) + +require ( + github.com/btcsuite/btcutil v1.0.2 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/sys v0.11.0 // indirect +) diff --git a/coins/polkadot/transaction.go b/coins/polkadot/transaction.go index d49d07f..8feedd6 100644 --- a/coins/polkadot/transaction.go +++ b/coins/polkadot/transaction.go @@ -208,7 +208,7 @@ func SignTx(tx TxStruct, txType int32, privateKey string) (string, error) { if err != nil { return "", err } - return "0x" + hex.EncodeToString(lengthBytes) + hex.EncodeToString(signed), nil + return util.EncodeHexWith0x(lengthBytes) + hex.EncodeToString(signed), nil } func SignTx2(tx TxStruct2, signature []byte) (string, error) { @@ -243,5 +243,5 @@ func SignTx2(tx TxStruct2, signature []byte) (string, error) { if err != nil { return "", err } - return "0x" + hex.EncodeToString(lengthBytes) + hex.EncodeToString(signed), nil + return util.EncodeHexWith0x(lengthBytes) + hex.EncodeToString(signed), nil } diff --git a/coins/solana/go.mod b/coins/solana/go.mod new file mode 100644 index 0000000..2b4b88e --- /dev/null +++ b/coins/solana/go.mod @@ -0,0 +1,13 @@ +module github.com/okx/go-wallet-sdk/coins/solana + +go 1.19 + +require ( + github.com/tyler-smith/go-bip39 v1.1.0 + github.com/okx/go-wallet-sdk/crypto v0.0.2 +) + +require ( + github.com/btcsuite/btcutil v1.0.2 // indirect + golang.org/x/crypto v0.12.0 // indirect +) diff --git a/coins/stacks/go.mod b/coins/stacks/go.mod new file mode 100644 index 0000000..8778987 --- /dev/null +++ b/coins/stacks/go.mod @@ -0,0 +1,18 @@ +module github.com/okx/go-wallet-sdk/coins/stacks + +go 1.19 + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 + github.com/stretchr/testify v1.8.4 + github.com/okx/go-wallet-sdk/crypto v0.0.2 + golang.org/x/crypto v0.12.0 +) + +require ( + github.com/btcsuite/btcutil v1.0.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/starknet/account.go b/coins/starknet/account.go index da5388e..620b689 100644 --- a/coins/starknet/account.go +++ b/coins/starknet/account.go @@ -7,9 +7,9 @@ import ( const ( //todo put your account class hash - AccountClassHash = "0x33434ad846cdd5f23eb73ff09fe6fddd568284a0fb7d1be20ee482f044dabe2" + AccountClassHash = "0x309c042d3729173c7f2f91a34f04d8c509c1b292d334679ef1aabf8da0899cc" //todo put your proxy account class hash - ProxyAccountClassHash = "0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918" + ProxyAccountClassHash = "0x3530cc4759d78042f1b543bf797f5f3d647cde0388c33734cf91b7f7b9314a9" ) func NewKeyPair(curve StarkCurve) (priv, pub string, err error) { diff --git a/coins/starknet/account_test.go b/coins/starknet/account_test.go index 11ee368..ace7dd7 100644 --- a/coins/starknet/account_test.go +++ b/coins/starknet/account_test.go @@ -31,7 +31,7 @@ func TestCalculateContractAddressFromHash(t *testing.T) { t.Fatal(err) } preAddress := BigToHexWithPadding(calculateAddress) - assert.Equal(t, "0x027850700bb0c1a9fe7c4dc7c253548e40f4b4fcc4d36f68551a557b19c0b3a2", preAddress) + assert.Equal(t, "0x076a18ceb1638b364b2bccd7652b3d024b0192b6cd97932d7a25638cd0c38cc3", preAddress) fmt.Println(preAddress) } @@ -56,6 +56,6 @@ func TestCreateSignedDeployAccountTx(t *testing.T) { if err != nil { t.Fatal(err) } - assert.Equal(t, `{"type":"DEPLOY_ACCOUNT","contract_address_salt":"0x4c3eb6ed976748ba6038adc996bc7efbae3915e71cb5ad9af3ae839aa5fe28e","constructor_calldata":["1449178161945088530446351771646113898511736767359683664273252560520029776866","215307247182100370520050591091822763712463273430149262739280891880522753123","2","2155411470851976624741272041507081168444512578889852119281177422738732606094","0"],"class_hash":"0x25ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918","max_fee":"0x7157cb0e14a0","version":"0x1","nonce":"0x0","signature":["2937863057704564206936475349638492456044380740625858385484870946711142421031","2715437793949255530037338139693287898654578972743579624372647390009359438003"]}`, string(jsonReq)) + assert.Equal(t, `{"type":"DEPLOY_ACCOUNT","contract_address_salt":"0x4c3eb6ed976748ba6038adc996bc7efbae3915e71cb5ad9af3ae839aa5fe28e","constructor_calldata":["1374167106255892599010711965180388247554893597343032596700351269194389035468","215307247182100370520050591091822763712463273430149262739280891880522753123","2","2155411470851976624741272041507081168444512578889852119281177422738732606094","0"],"class_hash":"0x3530cc4759d78042f1b543bf797f5f3d647cde0388c33734cf91b7f7b9314a9","max_fee":"0x7157cb0e14a0","version":"0x1","nonce":"0x0","signature":["1807287688609244063980416760800578370903099344795965990726567528439781006612","1207725556014061784011398195262770566842867382342357956710841026815216690815"]}`, string(jsonReq)) fmt.Println(string(jsonReq)) } diff --git a/coins/starknet/go.mod b/coins/starknet/go.mod new file mode 100644 index 0000000..c3f9fc8 --- /dev/null +++ b/coins/starknet/go.mod @@ -0,0 +1,15 @@ +module github.com/okx/go-wallet-sdk/coins/starknet + +go 1.19 + +require ( + github.com/stretchr/testify v1.8.4 + golang.org/x/crypto v0.12.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/sys v0.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/starknet/transaction_test.go b/coins/starknet/transaction_test.go index e340180..b9cdb1e 100644 --- a/coins/starknet/transaction_test.go +++ b/coins/starknet/transaction_test.go @@ -15,7 +15,7 @@ func TestJsonRpc(t *testing.T) { //create transaction curve := SC() contractAddr := ETH - from := "0x027850700bb0c1a9fe7c4dc7c253548e40f4b4fcc4d36f68551a557b19c0b3a2" + from := "0x076a18ceb1638b364b2bccd7652b3d024b0192b6cd97932d7a25638cd0c38cc3" to := "0x6c3c93eeb1643740a80a338b9346c0c9a06177bfcc098a6d86e353532090ae4" amount := big.NewInt(1700000000000000) maxFee := big.NewInt(14000000000000) @@ -33,7 +33,7 @@ func TestJsonRpc(t *testing.T) { b, _ := json.Marshal(request) t.Logf(string(b)) - assert.Equal(t, `{"type":"INVOKE_FUNCTION","sender_address":"0x027850700bb0c1a9fe7c4dc7c253548e40f4b4fcc4d36f68551a557b19c0b3a2","calldata":["1","2087021424722619777119509474943472645767659996348769578120564519014510906823","232670485425082704932579856502088130646006032362877466777181098476241604910","0","3","3","3059801216421328751596122112822479687228268238922911799033205908290402847460","1700000000000000","0"],"max_fee":"0xcbba106e000","signature":["3316003862596213685187927938396555541641565477986172535417248434450520075036","207497642185058112223994813923795045316971441670508760190438453143208354315"],"version":"0x1","nonce":"0x1"}`, string(b)) + assert.Equal(t, `{"type":"INVOKE_FUNCTION","sender_address":"0x076a18ceb1638b364b2bccd7652b3d024b0192b6cd97932d7a25638cd0c38cc3","calldata":["1","2087021424722619777119509474943472645767659996348769578120564519014510906823","232670485425082704932579856502088130646006032362877466777181098476241604910","0","3","3","3059801216421328751596122112822479687228268238922911799033205908290402847460","1700000000000000","0"],"max_fee":"0xcbba106e000","signature":["3401628654028065778841119644550530891055048890957579557528273384328460537572","2931185323066124925754585519252992698493396142856989191034518059513125992525"],"version":"0x1","nonce":"0x1"}`, string(b)) } func getNonce(address string, net string) (*big.Int, error) { @@ -88,7 +88,7 @@ func TestStarkEx(t *testing.T) { func TestCreateContractTx(t *testing.T) { curve := SC() contractAddr := ETHBridge - from := "0x027850700bb0c1a9fe7c4dc7c253548e40f4b4fcc4d36f68551a557b19c0b3a2" + from := "0x076a18ceb1638b364b2bccd7652b3d024b0192b6cd97932d7a25638cd0c38cc3" maxFee := big.NewInt(1864315586779310) nonce := big.NewInt(2) functionName := "initiate_withdraw" @@ -102,5 +102,5 @@ func TestCreateContractTx(t *testing.T) { request := tx.GetTxRequest() b, _ := json.Marshal(request) t.Logf(string(b)) - assert.Equal(t, `{"type":"INVOKE_FUNCTION","sender_address":"0x027850700bb0c1a9fe7c4dc7c253548e40f4b4fcc4d36f68551a557b19c0b3a2","calldata":["1","3256441166037631918262930812410838598500200462657642943867372734773841898370","403823062618199777388530751713272716715733872218085068081490028803159187238","0","3","3","564521648175006025532572708057195208089056127251","1000000000000000","0"],"max_fee":"0x69f95cc4c98ae","signature":["205010620035651583898118207596984197687754972756456862120522896476547105292","1154716553731371905121479884741907505965615780937256245747265484914503769789"],"version":"0x1","nonce":"0x2"}`, string(b)) + assert.Equal(t, `{"type":"INVOKE_FUNCTION","sender_address":"0x076a18ceb1638b364b2bccd7652b3d024b0192b6cd97932d7a25638cd0c38cc3","calldata":["1","3256441166037631918262930812410838598500200462657642943867372734773841898370","403823062618199777388530751713272716715733872218085068081490028803159187238","0","3","3","564521648175006025532572708057195208089056127251","1000000000000000","0"],"max_fee":"0x69f95cc4c98ae","signature":["997530001645826245217076867597411200842987068991821492017648518099258243988","1328037646647848873512528341661941339565391129262876084553664272191049071268"],"version":"0x1","nonce":"0x2"}`, string(b)) } diff --git a/coins/sui/go.mod b/coins/sui/go.mod new file mode 100644 index 0000000..c97bba0 --- /dev/null +++ b/coins/sui/go.mod @@ -0,0 +1,16 @@ +module github.com/okx/go-wallet-sdk/coins/sui + +go 1.19 + +require ( + github.com/dchest/blake2b v1.0.0 + github.com/stretchr/testify v1.8.4 + github.com/okx/go-wallet-sdk/crypto v0.0.2 +) + +require ( + github.com/btcsuite/btcutil v1.0.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/coins/tron/go.mod b/coins/tron/go.mod new file mode 100644 index 0000000..55cc073 --- /dev/null +++ b/coins/tron/go.mod @@ -0,0 +1,18 @@ +module github.com/okx/go-wallet-sdk/coins/tron + +go 1.19 + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/golang/protobuf v1.5.3 + github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/util v0.0.2 + golang.org/x/crypto v0.12.0 +) + +require ( + github.com/btcsuite/btcutil v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + golang.org/x/sys v0.11.0 // indirect + google.golang.org/protobuf v1.26.0 // indirect +) diff --git a/crypto/go.mod b/crypto/go.mod new file mode 100644 index 0000000..cadf0bb --- /dev/null +++ b/crypto/go.mod @@ -0,0 +1,21 @@ +module github.com/okx/go-wallet-sdk/crypto + +go 1.19 + +require ( + github.com/btcsuite/btcd/btcec/v2 v2.3.2 + github.com/btcsuite/btcd/btcutil v1.1.3 + github.com/btcsuite/btcutil v1.0.2 + github.com/tyler-smith/go-bip32 v1.0.0 + github.com/tyler-smith/go-bip39 v1.1.0 + golang.org/x/crypto v0.12.0 +) + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd v0.23.0 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + golang.org/x/sys v0.11.0 // indirect +) diff --git a/util/go.mod b/util/go.mod new file mode 100644 index 0000000..4b44b70 --- /dev/null +++ b/util/go.mod @@ -0,0 +1,7 @@ +module github.com/okx/go-wallet-sdk/util + +go 1.19 + +require golang.org/x/crypto v0.12.0 + +require golang.org/x/sys v0.11.0 // indirect diff --git a/util/hex.go b/util/hex.go index f802b0e..f740812 100644 --- a/util/hex.go +++ b/util/hex.go @@ -43,3 +43,23 @@ func DecodeHexString(hexString string) ([]byte, error) { } return hex.DecodeString(hexString) } + +func HasHexPrefix(str string) bool { + return len(str) >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X') +} + +func IsHex(str string) bool { + if len(str)%2 != 0 { + return false + } + for _, c := range []byte(str) { + if !isHexCharacter(c) { + return false + } + } + return true +} + +func isHexCharacter(c byte) bool { + return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') +} diff --git a/util/int.go b/util/int.go new file mode 100644 index 0000000..0390935 --- /dev/null +++ b/util/int.go @@ -0,0 +1,8 @@ +package util + +import "strconv" + +func ConvertToUint64(v string) uint64 { + i, _ := strconv.ParseUint(v, 10, 64) + return i +} From 0b6e82da5496cf9ad042b60c26261f58668b3f97 Mon Sep 17 00:00:00 2001 From: "minmin.yan" Date: Fri, 18 Aug 2023 16:24:48 +0800 Subject: [PATCH 2/3] update go mod --- coins/aptos/go.mod | 2 +- coins/bitcoin/go.mod | 4 ++-- coins/cosmos/go.mod | 2 +- coins/ethereum/go.mod | 4 ++-- coins/filecoin/go.mod | 2 +- coins/near/go.mod | 4 ++-- coins/polkadot/go.mod | 4 ++-- coins/solana/go.mod | 2 +- coins/stacks/go.mod | 2 +- coins/sui/go.mod | 2 +- coins/tron/go.mod | 4 ++-- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/coins/aptos/go.mod b/coins/aptos/go.mod index c814dc0..f109cba 100644 --- a/coins/aptos/go.mod +++ b/coins/aptos/go.mod @@ -3,7 +3,7 @@ module github.com/okx/go-wallet-sdk/coins/aptos go 1.19 require ( - github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 golang.org/x/crypto v0.12.0 ) diff --git a/coins/bitcoin/go.mod b/coins/bitcoin/go.mod index 5319ff4..d3876cf 100644 --- a/coins/bitcoin/go.mod +++ b/coins/bitcoin/go.mod @@ -9,8 +9,8 @@ require ( github.com/btcsuite/btcd/btcutil/psbt v1.1.8 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 github.com/stretchr/testify v1.8.4 - github.com/okx/go-wallet-sdk/crypto v0.0.2 - github.com/okx/go-wallet-sdk/util v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 + github.com/okx/go-wallet-sdk/util v0.0.1 ) require ( diff --git a/coins/cosmos/go.mod b/coins/cosmos/go.mod index 4fa202d..c2d35d1 100644 --- a/coins/cosmos/go.mod +++ b/coins/cosmos/go.mod @@ -8,7 +8,7 @@ require ( github.com/ethereum/go-ethereum v1.12.2 github.com/stretchr/testify v1.8.4 github.com/tyler-smith/go-bip39 v1.1.0 - github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 golang.org/x/crypto v0.12.0 ) diff --git a/coins/ethereum/go.mod b/coins/ethereum/go.mod index 2c2c830..151ab86 100644 --- a/coins/ethereum/go.mod +++ b/coins/ethereum/go.mod @@ -6,8 +6,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/ethereum/go-ethereum v1.12.2 github.com/stretchr/testify v1.8.1 - github.com/okx/go-wallet-sdk/crypto v0.0.2 - github.com/okx/go-wallet-sdk/util v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 + github.com/okx/go-wallet-sdk/util v0.0.1 golang.org/x/crypto v0.12.0 ) diff --git a/coins/filecoin/go.mod b/coins/filecoin/go.mod index 31a8c03..538448f 100644 --- a/coins/filecoin/go.mod +++ b/coins/filecoin/go.mod @@ -8,7 +8,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 github.com/fxamacker/cbor v1.5.1 github.com/stretchr/testify v1.8.4 - github.com/okx/go-wallet-sdk/util v0.0.2 + github.com/okx/go-wallet-sdk/util v0.0.1 ) require ( diff --git a/coins/near/go.mod b/coins/near/go.mod index 04f6909..0793d10 100644 --- a/coins/near/go.mod +++ b/coins/near/go.mod @@ -5,8 +5,8 @@ go 1.19 require ( github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 - github.com/okx/go-wallet-sdk/crypto v0.0.2 - github.com/okx/go-wallet-sdk/util v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 + github.com/okx/go-wallet-sdk/util v0.0.1 ) require ( diff --git a/coins/polkadot/go.mod b/coins/polkadot/go.mod index c55f866..2d0957d 100644 --- a/coins/polkadot/go.mod +++ b/coins/polkadot/go.mod @@ -3,8 +3,8 @@ module github.com/okx/go-wallet-sdk/coins/polkadot go 1.19 require ( - github.com/okx/go-wallet-sdk/crypto v0.0.2 - github.com/okx/go-wallet-sdk/util v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 + github.com/okx/go-wallet-sdk/util v0.0.1 ) require ( diff --git a/coins/solana/go.mod b/coins/solana/go.mod index 2b4b88e..dedd637 100644 --- a/coins/solana/go.mod +++ b/coins/solana/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/tyler-smith/go-bip39 v1.1.0 - github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 ) require ( diff --git a/coins/stacks/go.mod b/coins/stacks/go.mod index 8778987..c78ff7c 100644 --- a/coins/stacks/go.mod +++ b/coins/stacks/go.mod @@ -6,7 +6,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 github.com/stretchr/testify v1.8.4 - github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 golang.org/x/crypto v0.12.0 ) diff --git a/coins/sui/go.mod b/coins/sui/go.mod index c97bba0..f3005ff 100644 --- a/coins/sui/go.mod +++ b/coins/sui/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/dchest/blake2b v1.0.0 github.com/stretchr/testify v1.8.4 - github.com/okx/go-wallet-sdk/crypto v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 ) require ( diff --git a/coins/tron/go.mod b/coins/tron/go.mod index 55cc073..dd8a915 100644 --- a/coins/tron/go.mod +++ b/coins/tron/go.mod @@ -5,8 +5,8 @@ go 1.19 require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/golang/protobuf v1.5.3 - github.com/okx/go-wallet-sdk/crypto v0.0.2 - github.com/okx/go-wallet-sdk/util v0.0.2 + github.com/okx/go-wallet-sdk/crypto v0.0.1 + github.com/okx/go-wallet-sdk/util v0.0.1 golang.org/x/crypto v0.12.0 ) From 19c0430e5ccbcf41359325e54b27a0e588ec05ed Mon Sep 17 00:00:00 2001 From: ll Date: Fri, 28 Jul 2023 20:47:47 +0800 Subject: [PATCH 3/3] Fix that build() in NewTxBuild() cannot be called externally. --- coins/bitcoin/basetx_build.go | 2 +- coins/bitcoin/basetx_test.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/coins/bitcoin/basetx_build.go b/coins/bitcoin/basetx_build.go index b93e40d..bc63ead 100644 --- a/coins/bitcoin/basetx_build.go +++ b/coins/bitcoin/basetx_build.go @@ -61,7 +61,7 @@ func (build *TransactionBuilder) AddOutput(address string, amount int64) { build.outputs = append(build.outputs, output) } -func (build *TransactionBuilder) build() (string, error) { +func (build *TransactionBuilder) Build() (string, error) { if len(build.inputs) == 0 || len(build.outputs) == 0 { return "", errors.New("invalid inputs or outputs") } diff --git a/coins/bitcoin/basetx_test.go b/coins/bitcoin/basetx_test.go index e77d001..6c8a7e3 100644 --- a/coins/bitcoin/basetx_test.go +++ b/coins/bitcoin/basetx_test.go @@ -20,7 +20,7 @@ func TestSignTx(t *testing.T) { txBuild := NewTxBuild(1, &chaincfg.TestNet3Params) txBuild.AddInput("c44a7f98434e5e875a573339f77d36022c79c525771fa88c72fa53f3a55eeaf7", 1, "41f6ddee917e8ed190f003374064ace7b21ec405964a9861b4c4a9d6ff69f920", "", "mouQtmBWDS7JnT65Grj2tPzdSmGKJgRMhE", 1488430) txBuild.AddOutput("mouQtmBWDS7JnT65Grj2tPzdSmGKJgRMhE", 1488200) - txHex, err := txBuild.build() + txHex, err := txBuild.Build() if err != nil { t.Fatal(err) } @@ -31,7 +31,7 @@ func TestSignTx(t *testing.T) { txBuild.AddInput("ce69ca86b68708afc8484dacb7730006e7eff6d0c18b18a16a9e91abeefeb08a", 0, "41f6ddee917e8ed190f003374064ace7b21ec405964a9861b4c4a9d6ff69f920", "", "2NF33rckfiQTiE5Guk5ufUdwms8PgmtnEdc", 2000) txBuild.AddOutput("2NF33rckfiQTiE5Guk5ufUdwms8PgmtnEdc", 900) txBuild.AddOutput("2NF33rckfiQTiE5Guk5ufUdwms8PgmtnEdc", 850) - txHex, err = txBuild.build() + txHex, err = txBuild.Build() if err != nil { t.Fatal(err) } @@ -41,7 +41,7 @@ func TestSignTx(t *testing.T) { txBuild = NewTxBuild(1, &chaincfg.TestNet3Params) txBuild.AddInput("0bc66f18fd95ca00b6569471aa2dcd47fe45d3446fbaeec9ced228b00713fe8c", 0, "41f6ddee917e8ed190f003374064ace7b21ec405964a9861b4c4a9d6ff69f920", "", "tb1qtsq9c4fje6qsmheql8gajwtrrdrs38kdzeersc", 200000) txBuild.AddOutput("tb1qtsq9c4fje6qsmheql8gajwtrrdrs38kdzeersc", 199700) - txHex, err = txBuild.build() + txHex, err = txBuild.Build() if err != nil { t.Fatal(err) } @@ -51,7 +51,7 @@ func TestSignTx(t *testing.T) { txBuild = NewTxBuild(1, &chaincfg.TestNet3Params) txBuild.AddInput("3cb62c77c5c3fc032100af4cae9eeb342829cbc5b49815f8db1bb8156314a784", 0, "41f6ddee917e8ed190f003374064ace7b21ec405964a9861b4c4a9d6ff69f920", "", "tb1pklh8lqax5l7m2ycypptv2emc4gata2dy28svnwcp9u32wlkenvsspcvhsr", 546) txBuild.AddOutput("tb1pklh8lqax5l7m2ycypptv2emc4gata2dy28svnwcp9u32wlkenvsspcvhsr", 300) - txHex, err = txBuild.build() + txHex, err = txBuild.Build() if err != nil { t.Fatal(err) }