import {
  openTransportReplayer,
  RecordStore,
} from "@ledgerhq/hw-transport-mocker";
import Trx from "../src/Trx";

test("getAppConfiguration", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e006000000
    <= 0f0001059000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.getAppConfiguration();
  expect(result).toEqual({
    allowData: true,
    allowContract: true,
    truncateAddress: true,
    signByHash: true,
    version: "0.1.5",
    versionN: 105,
  });
});

test("getAddress", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e002000015058000002c800000c3800000000000000000000000
    <= 41040357bda0e415396eab766d392d5b996eb4a0bec6ccbb166d581341ebb50ebb54c30b365823884d8169e4c784373f0d3b871f3d16bca0b33a292d98f6cf07855a225457646e57427a4664425031623873715a3552634644626b563373426d6e787359759000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.getAddress("44'/195'/0'/0/0");
  expect(result).toEqual({
    address: "TWdnWBzFdBP1b8sqZ5RcFDbkV3sBmnxsYu",
    publicKey:
      "040357bda0e415396eab766d392d5b996eb4a0bec6ccbb166d581341ebb50ebb54c30b365823884d8169e4c784373f0d3b871f3d16bca0b33a292d98f6cf07855a",
  });
});

test("signTransaction", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e0041000c9058000002c800000c38000000000000000000000000a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d
    <= 3816b17b81c0a528b9f7506029473c82a3931945999426550a18d788651cb59d2d674a2386501107af2d51a106a67f8cf2e6adf2aded3220b6d1fc9847aec7c0009000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.signTransaction(
    "44'/195'/0'/0/0",
    "0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d",
    []
  );
  expect(result).toEqual(
    "3816b17b81c0a528b9f7506029473c82a3931945999426550a18d788651cb59d2d674a2386501107af2d51a106a67f8cf2e6adf2aded3220b6d1fc9847aec7c000"
  );
});

test("signTransactionHash", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e005000035058000002c800000c3800000000000000000000000abfcd07e44a6bfc18efb18062c8e588c34f187e3d2b286d4411781acdf6692eb
    <= 37a3cce70ebf7d792222d93509475a28ef1c7709d9ba032bf01dff3e52bca98c5a6cf64b73428a3f412b7dab1504afe4ac11995049c27ecdf1b46493292e4c68019000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.signTransactionHash(
    "44'/195'/0'/0/0",
    "abfcd07e44a6bfc18efb18062c8e588c34f187e3d2b286d4411781acdf6692eb"
  );
  expect(result).toEqual(
    "37a3cce70ebf7d792222d93509475a28ef1c7709d9ba032bf01dff3e52bca98c5a6cf64b73428a3f412b7dab1504afe4ac11995049c27ecdf1b46493292e4c6801"
  );
});

test("signPersonalMessage", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e008000045058000002c800000c38000000000000000000000000000002c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e73205465737473
    <= af4fb6500ff9058835b564d43078d5b201b71a3d3ead0d113baf68c86199f5ef1ee8f6ea48016a991e9d4bff410b8a77ba604850a03ac5f9cfd5fd95e25842fc019000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.signPersonalMessage(
    "44'/195'/0'/0/0",
    Buffer.from("CryptoChain-TronSR Ledger Transactions Tests").toString("hex")
  );
  expect(result).toEqual(
    "af4fb6500ff9058835b564d43078d5b201b71a3d3ead0d113baf68c86199f5ef1ee8f6ea48016a991e9d4bff410b8a77ba604850a03ac5f9cfd5fd95e25842fc01"
  );
});

test("getSharedKey", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e00a000156058000002c800000c380000000000000000000000004e4e24db26e316049743d9149dc6878905d3e8633fb8c36e2cc63299e123d8a6b8fe5ada8c2c6364d94059c23afc8972de9d692b09674f677909bd5ff6d8d320b
    <= 04f3087b3d8f99fff119458a5e66f47a391af594e06e4f23e7849347125648a4c93369c0e4a5cce4aabec92f0abf90c94ca33cdeef905d848dfba5e12a8d77137a9000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.getECDHPairKey(
    "44'/195'/0'/0/0",
    "04e4e24db26e316049743d9149dc6878905d3e8633fb8c36e2cc63299e123d8a6b8fe5ada8c2c6364d94059c23afc8972de9d692b09674f677909bd5ff6d8d320b"
  );
  expect(result).toEqual(
    "04f3087b3d8f99fff119458a5e66f47a391af594e06e4f23e7849347125648a4c93369c0e4a5cce4aabec92f0abf90c94ca33cdeef905d848dfba5e12a8d77137a"
  );
});

test("signTIP712HashedMessage", async () => {
  const transport = await openTransportReplayer(
    RecordStore.fromString(`
    => e00c000055058000002c800000c380000000000000000000000001010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202
    <= 1c9b03dd6de5285ac5a648d7288f111e8aafc6ae36338e000130011f1eb68fbbe9760513d08cb2a582d96af3559e5c1185235e3a35b14f223751254659108a5f1a9000
    `)
  );
  const trx = new Trx(transport);
  const result = await trx.signTIP712HashedMessage(
    "44'/195'/0'/0/0",
    Buffer.from("0101010101010101010101010101010101010101010101010101010101010101", "hex").toString(
      "hex"
    ),
    Buffer.from("0202020202020202020202020202020202020202020202020202020202020202", "hex").toString(
      "hex"
    )
  );
  expect(result).toEqual(
    "1c9b03dd6de5285ac5a648d7288f111e8aafc6ae36338e000130011f1eb68fbbe9760513d08cb2a582d96af3559e5c1185235e3a35b14f223751254659108a5f1a"
  );
});
