$ /opt/homebrew/bin/wasm-validate --enable-all fixtures/wasm/ledger.wasm

[exit 0]

$ /opt/homebrew/bin/wasm-objdump -h -x fixtures/wasm/ledger.wasm
ledger.wasm:	file format wasm 0x1

Sections:

     Type start=0x0000000a end=0x0000001a (size=0x00000010) count: 3
   Import start=0x0000001c end=0x00000027 (size=0x0000000b) count: 1
 Function start=0x00000029 end=0x0000002e (size=0x00000005) count: 4
   Memory start=0x00000030 end=0x00000033 (size=0x00000003) count: 1
   Export start=0x00000035 end=0x0000006e (size=0x00000039) count: 5
     Code start=0x00000071 end=0x0000010f (size=0x0000009e) count: 4
     Data start=0x00000111 end=0x00000122 (size=0x00000011) count: 1

Section Details:

Type[3]:
 - type[0] (i32) -> nil
 - type[1] (i32, i32) -> i32
 - type[2] (i32) -> i32
Import[1]:
 - func[0] sig=0 <env.log> <- env.log
Function[4]:
 - func[1] sig=1 <percent_change>
 - func[2] sig=2 <grade>
 - func[3] sig=1 <total>
 - func[4] sig=2 <grade_label>
Memory[1]:
 - memory[0] pages: initial=1
Export[5]:
 - memory[0] -> "memory"
 - func[1] <percent_change> -> "percent_change"
 - func[2] <grade> -> "grade"
 - func[3] <total> -> "total"
 - func[4] <grade_label> -> "grade_label"
Code[4]:
 - func[1] size=23 <percent_change>
 - func[2] size=63 <grade>
 - func[3] size=44 <total>
 - func[4] size=23 <grade_label>
Data[1]:
 - segment[0] memory=0 size=10 - init i32=1024
  - 0000400: 4600 4400 4300 4200 4100                 F.D.C.B.A.
[exit 0]

$ /opt/homebrew/bin/wasm2wat --enable-all fixtures/wasm/ledger.wasm
(module
  (type (;0;) (func (param i32)))
  (type (;1;) (func (param i32 i32) (result i32)))
  (type (;2;) (func (param i32) (result i32)))
  (import "env" "log" (func (;0;) (type 0)))
  (func (;1;) (type 1) (param i32 i32) (result i32)
    local.get 0
    i32.eqz
    if (result i32)  ;; label = @1
      i32.const 0
    else
      local.get 1
      local.get 0
      i32.sub
      i32.const 100
      i32.mul
      local.get 0
      i32.div_s
    end)
  (func (;2;) (type 2) (param i32) (result i32)
    (local i32)
    local.get 0
    i32.const 10
    i32.div_s
    local.set 1
    block (result i32)  ;; label = @1
      block  ;; label = @2
        block  ;; label = @3
          block  ;; label = @4
            block  ;; label = @5
              block  ;; label = @6
                local.get 1
                br_table 4 (;@2;) 4 (;@2;) 4 (;@2;) 4 (;@2;) 4 (;@2;) 4 (;@2;) 3 (;@3;) 2 (;@4;) 1 (;@5;) 0 (;@6;) 0 (;@6;) 4 (;@2;)
              end
              i32.const 4
              br 4 (;@1;)
            end
            i32.const 3
            br 3 (;@1;)
          end
          i32.const 2
          br 2 (;@1;)
        end
        i32.const 1
        br 1 (;@1;)
      end
      i32.const 0
    end)
  (func (;3;) (type 1) (param i32 i32) (result i32)
    (local i32 i32)
    block  ;; label = @1
      loop  ;; label = @2
        local.get 3
        local.get 1
        i32.ge_s
        br_if 1 (;@1;)
        local.get 2
        local.get 0
        local.get 3
        i32.const 4
        i32.mul
        i32.add
        i32.load
        i32.add
        local.set 2
        local.get 3
        i32.const 1
        i32.add
        local.set 3
        br 0 (;@2;)
      end
    end
    local.get 2)
  (func (;4;) (type 2) (param i32) (result i32)
    (local i32)
    local.get 0
    call 2
    local.set 1
    local.get 1
    call 0
    i32.const 1024
    local.get 1
    i32.const 2
    i32.mul
    i32.add)
  (memory (;0;) 1)
  (export "memory" (memory 0))
  (export "percent_change" (func 1))
  (export "grade" (func 2))
  (export "total" (func 3))
  (export "grade_label" (func 4))
  (data (;0;) (i32.const 1024) "F\00D\00C\00B\00A\00"))
[exit 0]
