//        [InlineData("https://www.ddpurse.com/openapi,561b756d12572020ea9a104c3441b71790acbbce95a6ddbf7e0630971af9424b")]
        // TAAL's GetTransactionStatus fails for older transactions. The error suggests using GetTransaction.
//        [InlineData("https://merchantapi.taal.com")]
        public async Task MapiGetTxStatusTest(string baseUrl)
        {
            KzMerchantClient.UserAgent = "KzMerchantClientTest";
            var mapi   = KzMerchantClient.GetClient(baseUrl);
            var hashTx = "3ea6bb35923dbff216aa11084280e0d6d477d78ed8010edac92c3253b3d79024";
            var ts     = await mapi.GetTransactionStatus(hashTx);

            Assert.NotNull(ts);
            Assert.Equal("0.1.0", ts.ApiVersion);
            Assert.True(Math.Abs((ts.Timestamp - DateTime.UtcNow).TotalMinutes) < 1);
            Assert.True(new PublicKey(ts.MinerId).IsValid);
            Assert.Equal("success", ts.ReturnResult);
            Assert.Equal("", ts.ResultDescription);
            Assert.Equal("0000000000000000011e0221844b65bfbbc2599bbd7f71ca0f914a53d90fa8b6", ts.BlockHash);
            Assert.Equal(631498, ts.BlockHeight);
            Assert.True(ts.Confirmations > 90);

            hashTx = "3ea6bb35923dbff200000000000000000077d78ed8010edac92c3253b3d79024";
            ts     = await mapi.GetTransactionStatus(hashTx);

            Assert.NotNull(ts);
            Assert.Equal("0.1.0", ts.ApiVersion);
            Assert.True(Math.Abs((ts.Timestamp - DateTime.UtcNow).TotalMinutes) < 1);
            Assert.True(new PublicKey(ts.MinerId).IsValid);
            Assert.Equal("failure", ts.ReturnResult);
            Assert.True(ts.ResultDescription.Length > 0);
            Assert.Null(ts.BlockHash);
            Assert.Null(ts.BlockHeight);
            Assert.True(ts.Confirmations == 0);
        }
        public async Task GetTransactionStatus(string hashTx)
        {
            KzMerchantClient.UserAgent = "KzMerchantClientTest";
            var mapi = KzMerchantClient.GetClient();
            var ts   = await mapi.GetTransactionStatus(hashTx);

            Assert.NotNull(ts);
            Assert.Equal("0.1.0", ts.apiVersion);
            Assert.True(Math.Abs((ts.timestamp - DateTime.UtcNow).TotalMinutes) < 1);
            Assert.Equal("0000000000000000011e0221844b65bfbbc2599bbd7f71ca0f914a53d90fa8b6", ts.blockHash);
            Assert.Equal(631498, ts.blockHeight);
            Assert.True(ts.confirmations > 90);
            Assert.True(new PublicKey(ts.minerId).IsValid);
            Assert.Equal("success", ts.returnResult);
            Assert.Equal("", ts.resultDescription);
        }
        public async Task MapiGetFeeQuoteTest(string baseUrl, string version)
        {
            KzMerchantClient.UserAgent = "KzMerchantClientTest";
            var mapi     = KzMerchantClient.GetClient(baseUrl);
            var feeQuote = await mapi.GetFeeQuote();

            Assert.NotNull(feeQuote);
            Assert.True(feeQuote.ExpiryTime > DateTime.UtcNow);
            Assert.True(Math.Abs((feeQuote.Timestamp - DateTime.UtcNow).TotalMinutes) < 1);
            Assert.Equal(version, feeQuote.ApiVersion);
            Assert.True(feeQuote.CurrentHighestBlockHeight > 630000);
            Assert.True(new UInt256(feeQuote.CurrentHighestBlockHash).ToBigInteger() > 0);
            Assert.Equal(2, feeQuote.Fees.Length);
            Assert.True(new PublicKey(feeQuote.MinerId).IsValid);
            Assert.True(feeQuote.MiningRates.standard.Bytes > 0);
            Assert.True(feeQuote.MiningRates.standard.Satoshis >= 0);
            Assert.True(feeQuote.RelayRates.standard.Bytes > 0);
            Assert.True(feeQuote.RelayRates.standard.Satoshis >= 0);
        }
        public async Task MapiPostTxTest(string baseUrl, string version)
        {
            KzMerchantClient.UserAgent = "KzMerchantClientTest";
            var mapi = KzMerchantClient.GetClient(baseUrl);
            // Transaction with lower input value than output value (negative fee...).
            const string tx1 = "0100000001747623f8e6f9b684c2c72d81245d1f1532043088e76ba63805339823e5b16389000000006a47304402204c108078b91ef1f6d2ce154b11bca8c31f6d37dac451a28c07edd7e737efef3802201ecfb09763d64d3ad293eec1c4ecaf0fd45b91dbdf428e422d282b98483300de4121036166800571f944768676842e4d2f8f96825c0f030139b6b78d6c9830de082828ffffffff09f9e15100000000001976a9143e0ea504169d4ef931e913cbbecb3f07b1d4b6f088acf9e15100000000001976a914229db1b4735321f46165ae5837e47dabd064f16e88acf9e15100000000001976a9144a5b03c7eea7b8e6e611559627a56963d514d1ea88ac6e6e5700000000001976a914c042299061557b60e0e5085bee8fadc8d7e5483388acf9e15100000000001976a914633d58a958c54d9858887b0f3aa65be4eb37f07488acf9e15100000000001976a9148d3cf51026f94d03fda5709160c7171b855ba22488ac50c84c00000000001976a9142a03a8943e47cdbd9ba448994e61d237e8d1ac4b88acf9e15100000000001976a914359f98091121e785e6663f10251832d9ae556f8588acf9e15100000000001976a91415a8feff23bfce20f837956c82e1eb1f2457f93488ac00000000";
            var          srl = new KzServiceRequestLog();
            var          ptr = await mapi.PostTransaction(tx1.HexToBytes(), srl);

            Assert.False(srl.Success);
            Assert.NotNull(ptr);
            Assert.Equal(version, ptr.ApiVersion);
            Assert.True(ptr.currentHighestBlockHeight > 630000);
            Assert.True(new UInt256(ptr.currentHighestBlockHash).ToBigInteger() > 0);
            Assert.True(Math.Abs((ptr.Timestamp - DateTime.UtcNow).TotalMinutes) < 1);
            Assert.True(new PublicKey(ptr.minerId).IsValid);
            Assert.Equal("failure", ptr.returnResult);
            Assert.True(ptr.resultDescription.Length > 0); // e.g. Not enough fees
            Assert.Equal("", ptr.txid);                    // e.g. Not enough fees
            Assert.Equal(0, ptr.txSecondMempoolExpiry);    // e.g. Not enough fees
        }