use uint64 for balance, like other examples
This commit is contained in:
parent
f8cf19c4bb
commit
f5b28ebd77
|
@ -1,16 +1,16 @@
|
||||||
## ewasm “WRC20” token contract coding challenge
|
## ewasm “WRC20” token contract coding challenge
|
||||||
## https://gist.github.com/axic/16158c5c88fbc7b1d09dfa8c658bc363
|
## https://gist.github.com/axic/16158c5c88fbc7b1d09dfa8c658bc363
|
||||||
|
|
||||||
import ../eth_contracts, stint
|
import ../eth_contracts, endians
|
||||||
|
|
||||||
proc do_balance() =
|
proc do_balance() =
|
||||||
if getCallDataSize() != 24:
|
if getCallDataSize() != 24:
|
||||||
revert(nil, 0)
|
revert(nil, 0)
|
||||||
|
|
||||||
var address: array[20, byte]
|
var address{.noinit.}: array[20, byte]
|
||||||
callDataCopy(address, 4)
|
callDataCopy(address, 4)
|
||||||
|
|
||||||
var balance: array[32, byte]
|
var balance{.noinit.}: array[32, byte]
|
||||||
storageLoad(address, addr balance)
|
storageLoad(address, addr balance)
|
||||||
finish(addr balance, sizeof(balance).int32)
|
finish(addr balance, sizeof(balance).int32)
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ proc do_transfer() =
|
||||||
getCaller(addr sender)
|
getCaller(addr sender)
|
||||||
var recipient: array[20, byte]
|
var recipient: array[20, byte]
|
||||||
callDataCopy(recipient, 4)
|
callDataCopy(recipient, 4)
|
||||||
var value: uint64
|
var value: array[8, byte]
|
||||||
callDataCopy(value, 24)
|
callDataCopy(value, 24)
|
||||||
|
|
||||||
var senderBalance: array[32, byte]
|
var senderBalance: array[32, byte]
|
||||||
|
@ -30,18 +30,22 @@ proc do_transfer() =
|
||||||
var recipientBalance: array[32, byte]
|
var recipientBalance: array[32, byte]
|
||||||
storageLoad(recipient, addr recipientBalance)
|
storageLoad(recipient, addr recipientBalance)
|
||||||
|
|
||||||
var sb = readUintBE[256](senderBalance)
|
var sb, rb, v: uint64
|
||||||
var rb = readUintBE[256](recipientBalance)
|
|
||||||
let v = value.u256
|
bigEndian64(addr v, addr value)
|
||||||
|
bigEndian64(addr sb, addr senderBalance[32 - 8])
|
||||||
|
|
||||||
if sb < v:
|
if sb < v:
|
||||||
revert(nil, 0)
|
revert(nil, 0)
|
||||||
|
|
||||||
sb -= v
|
bigEndian64(addr rb, addr recipientBalance[32 - 8])
|
||||||
rb += v
|
|
||||||
|
sb -= v
|
||||||
|
rb += v # TODO there's an overflow possible here..
|
||||||
|
|
||||||
|
bigEndian64(addr senderBalance[32 - 8], addr sb)
|
||||||
|
bigEndian64(addr recipientBalance[32 - 8], addr rb)
|
||||||
|
|
||||||
senderBalance = sb.toByteArrayBE()
|
|
||||||
recipientBalance = rb.toByteArrayBE()
|
|
||||||
storageStore(sender, addr senderBalance)
|
storageStore(sender, addr senderBalance)
|
||||||
storageStore(recipient, addr recipientBalance)
|
storageStore(recipient, addr recipientBalance)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue