思路#
Cairo 中的 felt 有一个范围,如果超过了就会出现溢出,这题的 amount 需要传入一个大于 1000000000000000 的数,乘以另一个数 6007,使计算出来的值上溢后,等于 balance。balance 一开始是 0,每次调用 claim_coin 只能让 balance + 1。
题目旁边的 walkthrough 有很详细的解释,Cairo 的除法可以计算溢出,可以用 extern fn felt252_div( lhs: felt252, rhs: NonZero<felt252> ) -> felt252 nopanic;
得到答案。
如果 balance 是 1,尝试 1/6007
得到的 amount 如果大于 1000000000000000 就完成目标,如果不行就尝试 2/6007
...
本地写个 test 计算出需要的 amount。
然后 starkli invoke [contract] claim_coin
使得 balance 变成 1。
最后 starkli invoke [contract] buy_incense [计算得到的amount]
就能成功解决问题。
总结#
这题很简单,主要是了解 felt252 的特性。实际开发中,涉及到数学运算,一般来说会用 u256 之类的整型来代替 felt252。