omgnetwork / elixir-omg

OMG-Network repository of Watcher and Watcher Info
https://omg.network
Apache License 2.0
213 stars 59 forks source link

`transaction.create` doesn't deduct fee from `outputs` #1761

Closed ripzery closed 4 years ago

ripzery commented 4 years ago

Example response:

{
  "data": {
    "result": "complete",
    "transactions": [
      {
        "fee": {
          "amount": 1,
          "currency": "0x0000000000000000000000000000000000000000"
        },
        "inputs": [
          {
            "amount": 49910000000000000,
            "blknum": 138000,
            "creating_txhash": "0xf9b02554e85ed7ed291c0a7657519d38de7ec2660db1e7e5bb0b8f0b435c0fc4",
            "currency": "0x0000000000000000000000000000000000000000",
            "inserted_at": "2020-10-29T14:20:53Z",
            "oindex": 1,
            "otype": 1,
            "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92",
            "spending_txhash": null,
            "txindex": 0,
            "updated_at": "2020-10-29T14:20:53Z",
            "utxo_pos": 138000000000001
          },
          {
            "amount": 3000,
            "blknum": 142000,
            "creating_txhash": "0x8fe5f64976fdca50c15bd6d6a1b9aa473227b5d5650dc2136a8f5fceb5d0b75a",
            "currency": "0xd5b83b1fdbc00bfe3679a60b2cb6252418df0d99",
            "inserted_at": "2020-10-29T14:58:36Z",
            "oindex": 0,
            "otype": 1,
            "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92",
            "spending_txhash": null,
            "txindex": 0,
            "updated_at": "2020-10-29T14:58:36Z",
            "utxo_pos": 142000000000000
          }
        ],
        "metadata": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "outputs": [
          {
            "amount": 700,
            "currency": "0xd5b83b1fdbc00bfe3679a60b2cb6252418df0d99",
            "owner": "0xbdba40131ec2d16f067cc242644ea69e8afd0d4a"
          },
          {
            "amount": 49910000000000000,
            "currency": "0x0000000000000000000000000000000000000000",
            "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92"
          },
          {
            "amount": 2300,
            "currency": "0xd5b83b1fdbc00bfe3679a60b2cb6252418df0d99",
            "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92"
          }
        ],
        "sign_hash": "0x6f8a85fee13ab63fdb319537e3ff8b068875b85d3f2b01f5e92f5e8b729f3656",
        "txbytes": "0xf8fe01f842a000000000000000000000000000000000000000000000000000007d82a0faa001a000000000000000000000000000000000000000000000000000008125f38ee000f895ef01ed94bdba40131ec2d16f067cc242644ea69e8afd0d4a94d5b83b1fdbc00bfe3679a60b2cb6252418df0d998202bcf401f29431bc9ea3093d5a4faeff8fdf24499cea3f7c1f9294000000000000000000000000000000000000000087b150e16cbd5fffef01ed9431bc9ea3093d5a4faeff8fdf24499cea3f7c1f9294d5b83b1fdbc00bfe3679a60b2cb6252418df0d998208fc80a00000000000000000000000000000000000000000000000000000000000000000",
        "typed_data": {
          "domain": {
            "name": "OMG Network",
            "salt": "0xfad5c7f626d80f9256ef01929f3beb96e058b8b4b0e3fe52d84f054c0e2a7a83",
            "verifyingContract": "0xb43f53394d86deab35bc2d8356d6522ced6429b5",
            "version": "1"
          },
          "message": {
            "input0": {
              "blknum": 138000,
              "oindex": 1,
              "txindex": 0
            },
            "input1": {
              "blknum": 142000,
              "oindex": 0,
              "txindex": 0
            },
            "input2": {
              "blknum": 0,
              "oindex": 0,
              "txindex": 0
            },
            "input3": {
              "blknum": 0,
              "oindex": 0,
              "txindex": 0
            },
            "metadata": "0x0000000000000000000000000000000000000000000000000000000000000000",
            "output0": {
              "amount": 700,
              "currency": "0xd5b83b1fdbc00bfe3679a60b2cb6252418df0d99",
              "owner": "0xbdba40131ec2d16f067cc242644ea69e8afd0d4a"
            },
            "output1": {
              "amount": 49910000000000000,
              "currency": "0x0000000000000000000000000000000000000000",
              "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92"
            },
            "output2": {
              "amount": 2300,
              "currency": "0xd5b83b1fdbc00bfe3679a60b2cb6252418df0d99",
              "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92"
            },
            "output3": {
              "amount": 0,
              "currency": "0x0000000000000000000000000000000000000000",
              "owner": "0x0000000000000000000000000000000000000000"
            }
          },
          "primaryType": "Transaction",
          "types": {
            "EIP712Domain": [
              {
                "name": "name",
                "type": "string"
              },
              {
                "name": "version",
                "type": "string"
              },
              {
                "name": "verifyingContract",
                "type": "address"
              },
              {
                "name": "salt",
                "type": "bytes32"
              }
            ],
            "Input": [
              {
                "name": "blknum",
                "type": "uint256"
              },
              {
                "name": "txindex",
                "type": "uint256"
              },
              {
                "name": "oindex",
                "type": "uint256"
              }
            ],
            "Output": [
              {
                "name": "outputType",
                "type": "uint256"
              },
              {
                "name": "outputGuard",
                "type": "bytes20"
              },
              {
                "name": "currency",
                "type": "address"
              },
              {
                "name": "amount",
                "type": "uint256"
              }
            ],
            "Transaction": [
              {
                "name": "txType",
                "type": "uint256"
              },
              {
                "name": "input0",
                "type": "Input"
              },
              {
                "name": "input1",
                "type": "Input"
              },
              {
                "name": "input2",
                "type": "Input"
              },
              {
                "name": "input3",
                "type": "Input"
              },
              {
                "name": "output0",
                "type": "Output"
              },
              {
                "name": "output1",
                "type": "Output"
              },
              {
                "name": "output2",
                "type": "Output"
              },
              {
                "name": "output3",
                "type": "Output"
              },
              {
                "name": "txData",
                "type": "uint256"
              },
              {
                "name": "metadata",
                "type": "bytes32"
              }
            ]
          }
        }
      }
    ]
  },
  "service_name": "watcher_info",
  "success": true,
  "version": "1.0.5+54305bb"
}
kalouo commented 4 years ago

Alright, so if you look at this function that builds a transaction’s outputs, you see that the fee is passed in along with the payments for the derivation of the “change” amount. So the “change” output takes into account the fee. If you look at the test suite, the deduction of the fees is also clearly covered in multiple tests (see : here. – it’s not explicit but you can conclude with some simple arithmetic) (edited)

kalouo commented 4 years ago

Call to https://watcher-info.rinkeby.v1.omg.network/transaction.create with OMG fee:

Request Parameters:

{
  "fee" : {"currency": "0x0000000000000000000000000000000000000000"},
  "owner":  "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92",
  "payments": [
    {
      "amount": 1,
      "currency": "0x0000000000000000000000000000000000000000",
      "owner": "0xc139e1d7358e4faf76f0fcf792255016af5dc742"
    }
  ] 
}

Response:

...
 "inputs": [
          {
            "amount": 49910000000000000,
            "blknum": 138000,
            "creating_txhash": "0xf9b02554e85ed7ed291c0a7657519d38de7ec2660db1e7e5bb0b8f0b435c0fc4",
            "currency": "0x0000000000000000000000000000000000000000",
            "inserted_at": "2020-10-29T14:20:53Z",
            "oindex": 1,
            "otype": 1,
            "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92",
            "spending_txhash": null,
            "txindex": 0,
            "updated_at": "2020-10-29T14:20:53Z",
            "utxo_pos": 138000000000001
          }
        ],
        "metadata": null,
        "outputs": [
          {
            "amount": 1,
            "currency": "0x0000000000000000000000000000000000000000",
            "owner": "0xc139e1d7358e4faf76f0fcf792255016af5dc742"
          },
          {
            "amount": 49909999999999998,
            "currency": "0x0000000000000000000000000000000000000000",
            "owner": "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92"
          }
        ]
...
kalouo commented 4 years ago

The fee is clearly being deducted in the change output.

kalouo commented 4 years ago

Above call was made with the same address as the inputs owner in the issue: "0x31bc9ea3093d5a4faeff8fdf24499cea3f7c1f92"

nicholasmueller commented 4 years ago

closing as this is indeed not a bug in the watcher but an implementation detail in the clients environment. (big number rounding)