Commit 151fbd76 authored by duanjinfei's avatar duanjinfei

add test case

parent 8026f4a8
# contract-case
solc --abi --bin ChainCoinTransfer.sol -o .
solc --abi --bin OneChainCoinTransfer.sol -o .
solc --abi --bin TwoChainCoinTransfer.sol -o .
solc --abi --bin contract_abi/coin_transfer/contract/ChainCoinTransfer.sol -o contract_abi/coin_transfer/abi_bin --overwrite
solc --abi --bin contract_abi/coin_transfer/contract/OneChainCoinTransfer.sol -o contract_abi/coin_transfer/abi_bin --overwrite
solc --abi --bin contract_abi/coin_transfer/contract/TwoChainCoinTransfer.sol -o contract_abi/coin_transfer/abi_bin --overwrite
abigen --bin ChainCoinTransfer.bin --abi ChainCoinTransfer.abi --pkg contractCoin --type ChainCoinTransfer --out ../compile/ChainCoinTransfer.go
abigen --bin OneChainCoinTransfer.bin --abi OneChainCoinTransfer.abi --pkg contractCoin --type OneChainCoinTransfer --out ../compile/OneChainCoinTransfer.go
abigen --bin TwoChainCoinTransfer.bin --abi TwoChainCoinTransfer.abi --pkg contractCoin --type TwoChainCoinTransfer --out ../compile/TwoChainCoinTransfer.go
......
......@@ -15,6 +15,26 @@ type ContractCoinOneTrade struct {
Amount *big.Int
}
func (trade *ContractCoinOneTrade) OneTransferSetTempSignTx(tranOpts *bind.TransactOpts, oneChainCoinTransfer *contractCoin.OneChainCoinTransfer) (*types.Transaction, error) {
oneTransferTx, err := oneChainCoinTransfer.SetChainCoinTransferContract(tranOpts, trade.ChainContractAdr)
if err != nil {
log.Errorf("OneTransferSignTx func SetChainCoinTransferContract tx error: %s", err)
return nil, err
}
log.Info("OneTransfer:", oneTransferTx.Hash())
return oneTransferTx, nil
}
func (trade *ContractCoinOneTrade) OneTransferSetAfterSignTx(tranOpts *bind.TransactOpts, oneChainCoinTransfer *contractCoin.OneChainCoinTransfer) (*types.Transaction, error) {
oneTransferTx, err := oneChainCoinTransfer.OneTempTransfer(tranOpts, trade.ToAddr, trade.Amount)
if err != nil {
log.Errorf("OneTransferSignTx func OneTempTransfer tx error: %s", err)
return nil, err
}
log.Info("OneTransfer:", oneTransferTx.Hash())
return oneTransferTx, nil
}
func (trade *ContractCoinOneTrade) OneTransferSignTx(tranOpts *bind.TransactOpts, oneChainCoinTransfer *contractCoin.OneChainCoinTransfer) (*types.Transaction, error) {
oneTransferTx, err := oneChainCoinTransfer.OneTransfer(tranOpts, trade.ChainContractAdr, trade.ToAddr, trade.Amount)
if err != nil {
......
[{"inputs":[{"internalType":"address","name":"chainCoinAddr","type":"address"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"oneTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]
\ No newline at end of file
[{"inputs":[{"internalType":"address","name":"tempAddr","type":"address"}],"name":"SetChainCoinTransferContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"oneTempTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"chainCoinAddr","type":"address"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"oneTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"temp","outputs":[{"internalType":"contract IChainCoinTransfer","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
\ No newline at end of file
608060405234801561001057600080fd5b50610461806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80631805040514610030575b600080fd5b61004a600480360381019061004591906102bf565b61004c565b005b8273ffffffffffffffffffffffffffffffffffffffff16631939c1ff83836040518363ffffffff1660e01b81526004016100879291906103fb565b600060405180830381600087803b1580156100a157600080fd5b505af11580156100b5573d6000803e3d6000fd5b50505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100fd826100d2565b9050919050565b61010d816100f2565b811461011857600080fd5b50565b60008135905061012a81610104565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61017e82610135565b810181811067ffffffffffffffff8211171561019d5761019c610146565b5b80604052505050565b60006101b06100be565b90506101bc8282610175565b919050565b600067ffffffffffffffff8211156101dc576101db610146565b5b602082029050602081019050919050565b600080fd5b6000610205610200846101c1565b6101a6565b90508083825260208201905060208402830185811115610228576102276101ed565b5b835b81811015610251578061023d888261011b565b84526020840193505060208101905061022a565b5050509392505050565b600082601f8301126102705761026f610130565b5b81356102808482602086016101f2565b91505092915050565b6000819050919050565b61029c81610289565b81146102a757600080fd5b50565b6000813590506102b981610293565b92915050565b6000806000606084860312156102d8576102d76100c8565b5b60006102e68682870161011b565b935050602084013567ffffffffffffffff811115610307576103066100cd565b5b6103138682870161025b565b9250506040610324868287016102aa565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610363816100f2565b82525050565b6000610375838361035a565b60208301905092915050565b6000602082019050919050565b60006103998261032e565b6103a38185610339565b93506103ae8361034a565b8060005b838110156103df5781516103c68882610369565b97506103d183610381565b9250506001810190506103b2565b5085935050505092915050565b6103f581610289565b82525050565b60006040820190508181036000830152610415818561038e565b905061042460208301846103ec565b939250505056fea2646970667358221220a9ef4ef1aff041711f36e690b13f99c9fbf231c1d9181db88e74d68958a0eecc64736f6c63430008130033
\ No newline at end of file
608060405234801561000f575f80fd5b5061069a8061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063180504051461004e5780632b231a3d1461006a578063673402e514610086578063ff34e1df146100a4575b5f80fd5b6100686004803603810190610063919061040b565b6100c0565b005b610084600480360381019061007f9190610477565b61012d565b005b61008e6101b8565b60405161009b919061052c565b60405180910390f35b6100be60048036038101906100b99190610545565b6101db565b005b8273ffffffffffffffffffffffffffffffffffffffff16631939c1ff83836040518363ffffffff1660e01b81526004016100fb929190610636565b5f604051808303815f87803b158015610112575f80fd5b505af1158015610124573d5f803e3d5ffd5b50505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631939c1ff83836040518363ffffffff1660e01b8152600401610187929190610636565b5f604051808303815f87803b15801561019e575f80fd5b505af11580156101b0573d5f803e3d5ffd5b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102578261022e565b9050919050565b6102678161024d565b8114610271575f80fd5b50565b5f813590506102828161025e565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6102d28261028c565b810181811067ffffffffffffffff821117156102f1576102f061029c565b5b80604052505050565b5f61030361021d565b905061030f82826102c9565b919050565b5f67ffffffffffffffff82111561032e5761032d61029c565b5b602082029050602081019050919050565b5f80fd5b5f61035561035084610314565b6102fa565b905080838252602082019050602084028301858111156103785761037761033f565b5b835b818110156103a1578061038d8882610274565b84526020840193505060208101905061037a565b5050509392505050565b5f82601f8301126103bf576103be610288565b5b81356103cf848260208601610343565b91505092915050565b5f819050919050565b6103ea816103d8565b81146103f4575f80fd5b50565b5f81359050610405816103e1565b92915050565b5f805f6060848603121561042257610421610226565b5b5f61042f86828701610274565b935050602084013567ffffffffffffffff8111156104505761044f61022a565b5b61045c868287016103ab565b925050604061046d868287016103f7565b9150509250925092565b5f806040838503121561048d5761048c610226565b5b5f83013567ffffffffffffffff8111156104aa576104a961022a565b5b6104b6858286016103ab565b92505060206104c7858286016103f7565b9150509250929050565b5f819050919050565b5f6104f46104ef6104ea8461022e565b6104d1565b61022e565b9050919050565b5f610505826104da565b9050919050565b5f610516826104fb565b9050919050565b6105268161050c565b82525050565b5f60208201905061053f5f83018461051d565b92915050565b5f6020828403121561055a57610559610226565b5b5f61056784828501610274565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6105a28161024d565b82525050565b5f6105b38383610599565b60208301905092915050565b5f602082019050919050565b5f6105d582610570565b6105df818561057a565b93506105ea8361058a565b805f5b8381101561061a57815161060188826105a8565b975061060c836105bf565b9250506001810190506105ed565b5085935050505092915050565b610630816103d8565b82525050565b5f6040820190508181035f83015261064e81856105cb565b905061065d6020830184610627565b939250505056fea26469706673582212208c179c1a90b0d75a3cfab6e4f26b460d2b4b6a52358bcd5f38dbadae993bb4a164736f6c63430008140033
\ No newline at end of file
......@@ -4,6 +4,8 @@ pragma solidity ^0.8.9;
import "../../interface/IChainCoinTransfer.sol";
contract OneChainCoinTransfer {
IChainCoinTransfer public temp;
function oneTransfer(
address chainCoinAddr,
address[] memory toArr,
......@@ -11,4 +13,12 @@ contract OneChainCoinTransfer {
) external {
IChainCoinTransfer(chainCoinAddr).transfer(toArr, value);
}
function SetChainCoinTransferContract(address tempAddr) external {
temp = IChainCoinTransfer(tempAddr);
}
function oneTempTransfer(address[] memory toArr, uint256 value) external{
temp.transfer(toArr, value);
}
}
......@@ -31,6 +31,9 @@ func main() {
parseContractConfig := tool.ParseContractConfig("./config/contractConfig.json")
for _, caseType := range tool.Cfg.TransferType {
tranList, verifyFunc := operator.GetTranFunc(caseType, accIndex, 9, nonceMap, arrFormat, tool.Cfg.RpcNode, parseContractConfig)
if tranList == nil || verifyFunc == nil {
break
}
txArr = append(txArr, tranList...)
verifyFuncArr = append(verifyFuncArr, verifyFunc)
accIndex += 9
......
......@@ -462,6 +462,21 @@ func GetTranFunc(caseType int, startIndex int, txCount int, nonceMap *sync.Map,
{
return PrReOneErc20TranCase(txCount, arr, contractArr[0], nonceMap, txArr, client)
}
// Erc20 approve
case 26:
{
return PrSpErc20ApproveTranCase(txCount, arr, contractArr[4], nonceMap, txArr, client)
}
// Erc721 接受者相关
case 27:
{
return PrReErc721TranCase(startIndex, txCount, arr, contractArr[5], nonceMap, txArr, client)
}
//多层-合约转账- 先set合约的对象地址-〉调用合约的方法 :两笔交易并行发送,同一个块中执行
case 28:
{
return PrReContractOneCoinTranTwiceCase(txCount, arr, contractArr, nonceMap, txArr, client)
}
default:
{
return nil, nil
......
......@@ -1171,13 +1171,8 @@ func PrSpErc20ApproveTranCase(txCount int, testAccArr *tool.AccArrFormat, contra
return resTxArr, verify
}
// PrReSpOneErc20ApproveTranCase 多层-erc20-approve
func PrReSpOneErc20ApproveTranCase() {
}
// PrReErc721TranCase 单层-erc721-发送者相关
func PrReErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
// PrReErc721TranCase 单层-erc721-接受者相关
func PrReErc721TranCase(startIndex int, txCount int, testAccArr *tool.AccArrFormat, contractMap map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
erc721Trade := &contractErc721.Erc721Trade{
Erc721Addr: contractMap[constant.ERC721],
}
......@@ -1189,30 +1184,30 @@ func PrReErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
if err != nil {
return nil, nil
}
beforeToErc721Bal := make(map[common.Address]*big.Int, 0)
beforeFromErc721Bal := make(map[common.Address]*big.Int, 0)
toAddr := testAccArr.ToAddr[0]
beforeToErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, toAddr)
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return nil, nil
}
log.Info("Erc721 接受者相关 To balance:", beforeToErc721Bal.String())
for i := 0; i < txCount; i++ {
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
continue
}
erc721Trade.ToAddr = testAccArr.ToAddr[i]
toErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return nil, nil
}
erc721Trade.ToAddr = toAddr
fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
return nil, nil
}
beforeToErc721Bal[testAccArr.ToAddr[i]] = toErc721Bal
log.Info("Erc721 接受者相关 From balance:", fromErc721Bal.String())
beforeFromErc721Bal[testAccArr.FromAddr[i]] = fromErc721Bal
erc721Trade.FromAddr = testAccArr.FromAddr[i]
// todo 需要初始化时知道sender对应的tokenId
erc721Trade.TokenId = big.NewInt(int64(i))
erc721Trade.TokenId = big.NewInt(int64(startIndex))
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
auth.Nonce = big.NewInt(value.(int64))
auth.NoSend = true
......@@ -1223,25 +1218,29 @@ func PrReErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
return nil, nil
}
log.Info("Erc721TransferFromSignTx tx:", tx.Hash().Hex())
startIndex++
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
res := true
for i := 0; i < txCount; i++ {
toErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.ToAddr[i])
verifyToAddr := testAccArr.ToAddr[0]
toErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, verifyToAddr)
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
res = false
}
if beforeToErc721Bal[testAccArr.ToAddr[i]].Sub(beforeToErc721Bal[testAccArr.ToAddr[i]], toErc721Bal).Cmp(big.NewInt(1)) != 0 {
log.Info("Erc721 接受者相关 To balance:", toErc721Bal.String())
if beforeToErc721Bal.Sub(beforeToErc721Bal, toErc721Bal).Cmp(big.NewInt(int64(txCount))) != 0 {
res = false
}
for i := 0; i < txCount; i++ {
fromErc721Bal, err := erc721Contract.BalanceOf(&bind.CallOpts{}, testAccArr.FromAddr[i])
if err != nil {
log.Error("Get erc721 bal error:", err.Error())
res = false
}
if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeToErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 {
log.Info("Erc721 接受者相关 From balance:", fromErc721Bal.String())
if beforeFromErc721Bal[testAccArr.FromAddr[i]].Sub(beforeFromErc721Bal[testAccArr.FromAddr[i]], fromErc721Bal).Cmp(big.NewInt(1)) != 0 {
res = false
}
}
......@@ -1250,12 +1249,78 @@ func PrReErc721TranCase(txCount int, testAccArr *tool.AccArrFormat, contractMap
return resTxArr, verify
}
// PrSpErc721TranCase 单层-erc721-接受者相关
func PrSpErc721TranCase() {
}
// PrReSpErc721TranCase 单层-erc721-发送接受者相关
func PrReSpErc721TranCase() {
// PrReContractOneCoinTranTwiceCase 多层-合约转账- 先set合约的对象地址-〉调用合约的方法 :两笔交易并行发送,同一个块中执行
func PrReContractOneCoinTranTwiceCase(txCount int, testAccArr *tool.AccArrFormat, contractMap []map[string]common.Address, accountNonceMap *sync.Map, resTxArr []*types.Transaction, client *ethclient.Client) ([]*types.Transaction, func() bool) {
amount := big.NewInt(100000000000000000)
toAddr := testAccArr.ToAddr[0]
reBeforeToBal := util.GetAccBal(client, toAddr)
if reBeforeToBal == nil {
return nil, nil
}
sendBeforeContractBalMap := make(map[common.Address]*big.Int, 0)
for i := 0; i < txCount; i++ {
coinTranAddr := contractMap[i][constant.COIN_TRANSFER]
contractCoinOneTrade := &coin.ContractCoinOneTrade{
ChainContractAdr: contractMap[i][constant.COIN_TRANSFER],
Amount: amount,
}
oneChainCoinTransfer, err := contractCoin.NewOneChainCoinTransfer(contractMap[i][constant.ONE_COIN_TRANSFER], client)
if err != nil {
log.Error("NewOneChainCoinTransfer error:", err.Error())
return nil, nil
}
sendBeforeBal := util.GetAccBal(client, coinTranAddr)
if sendBeforeBal == nil {
return nil, nil
}
sendBeforeContractBalMap[contractMap[i][constant.COIN_TRANSFER]] = sendBeforeBal
contractCoinOneTrade.ToAddr = []common.Address{toAddr}
auth, err := bind.NewKeyedTransactorWithChainID(testAccArr.FromPrv[i], tool.Cfg.ChainId)
if err != nil {
log.Errorf("DeployTokenTransfer func newKeyedTransactorWithChainID err:", err)
}
value, _ := accountNonceMap.Load(testAccArr.FromAddr[i])
nonce := value.(int64)
auth.Nonce = big.NewInt(nonce)
auth.NoSend = true
auth.GasLimit = 500000
auth.GasPrice = big.NewInt(10000000000)
tx, err := contractCoinOneTrade.OneTransferSetTempSignTx(auth, oneChainCoinTransfer)
if err != nil {
log.Error("OneTransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
nonce++
auth.Nonce = big.NewInt(nonce)
tx, err = contractCoinOneTrade.OneTransferSetAfterSignTx(auth, oneChainCoinTransfer)
if err != nil {
log.Error("OneTransferSignTx error:", err.Error())
return nil, nil
}
resTxArr = append(resTxArr, tx)
}
verify := func() bool {
res := true
for i := 0; i < txCount; i++ {
coinAddr := contractMap[i][constant.COIN_TRANSFER]
sendBeforeBal := sendBeforeContractBalMap[coinAddr]
sendAfterBal := util.GetAccBal(client, coinAddr)
if sendAfterBal == nil {
res = false
}
if sendBeforeBal.Sub(sendBeforeBal, sendAfterBal).Cmp(amount) != 0 {
res = false
}
}
reAfterToBal := util.GetAccBal(client, toAddr)
if reAfterToBal == nil {
res = false
}
if reAfterToBal.Sub(reAfterToBal, reBeforeToBal).Cmp(big.NewInt(1).Mul(amount, big.NewInt(int64(txCount)))) != 0 {
res = false
}
return res
}
return resTxArr, verify
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment