balanceOf says what someone holds now. It cannot say how they got it. Logs can.
const transfer = parseAbiItem( 'event Transfer(address indexed from, address indexed to, uint256 value)' )
const logs = await client.getLogs({
address: addresses.AcademyToken, event: transfer,
fromBlock: 'earliest', toBlock: 'latest',
})
console.log(logs.length)// The token has emitted a Transfer event for every movement. // Vault: 0x4444444444444444444444444444444444444444