type receiptType =
  | @as(0) Call
  | @as(1) Return
  | @as(2) ReturnData
  | @as(3) Panic
  | @as(4) Revert
  | @as(5) Log
  | @as(6) LogData
  // Transfer is to another contract, TransferOut is to wallet address
  | @as(7) Transfer
  | @as(8) TransferOut
  | @as(9) ScriptResult
  | @as(10) MessageOut
  | @as(11) Mint
  | @as(12) Burn

@module("./vendored-fuel-abi-coder.js")
external transpileAbi: JSON.t => EvmTypes.Abi.t = "transpileAbi"

@module("./vendored-fuel-abi-coder.js") @scope("AbiCoder")
external getLogDecoder: (~abi: EvmTypes.Abi.t, ~logId: string) => string => unknown =
  "getLogDecoder"

module Receipt = {
  @tag("receiptType")
  type t =
    | @as(0) Call({assetId: string, amount: bigint, to: string})
    | @as(6) LogData({data: string, rb: bigint})
    | @as(7) Transfer({amount: bigint, assetId: string, to: string})
    | @as(8) TransferOut({amount: bigint, assetId: string, toAddress: string})
    | @as(11) Mint({val: bigint, subId: string})
    | @as(12) Burn({val: bigint, subId: string})

  let getLogDataDecoder = (~abi: EvmTypes.Abi.t, ~logId: string) => {
    let decode = getLogDecoder(~abi, ~logId)
    data => data->decode->(Utils.magic: 'a => Internal.eventParams)
  }
}
