2018-07-05 08:39:04 +00:00
|
|
|
|
import macros
|
|
|
|
|
|
2018-07-09 07:32:44 +00:00
|
|
|
|
{.push cdecl, importc.}
|
2018-07-05 08:39:04 +00:00
|
|
|
|
|
2018-07-09 07:32:44 +00:00
|
|
|
|
proc useGas*(amount: int64)
|
|
|
|
|
## Subtracts an amount to the gas counter
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `amount` - the amount to subtract to the gas counter
|
|
|
|
|
|
|
|
|
|
proc getAddress*(resultOffset: pointer)
|
|
|
|
|
## Gets address of currently executing account and loads it into memory at
|
|
|
|
|
## the given offset.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the address into (`address`)
|
|
|
|
|
|
|
|
|
|
proc getBalance*(addressOffset, resultOffset: pointer)
|
|
|
|
|
## Gets balance of the given account and loads it into memory at the given offset.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
# `resultOffset` the memory offset to load the balance into (`u128`)
|
|
|
|
|
|
|
|
|
|
proc getBlockHash*(number: int64, resultOffset: pointer)
|
|
|
|
|
## Gets the hash of one of the 256 most recent complete blocks.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `number` which block to load
|
|
|
|
|
## `resultOffset` the memory offset to load the hash into (`u256`)
|
|
|
|
|
|
|
|
|
|
proc call*(gas: int64, addressOffset, valueOffset, dataOffset: pointer,
|
|
|
|
|
dataLength: int32): int32
|
|
|
|
|
## Sends a message with arbitrary data to a given address path
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `gas` **i64** the gas limit
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
## `valueOffset` the memory offset to load the value from (`u128`)
|
|
|
|
|
## `dataOffset` the memory offset to load data from (`bytes`)
|
|
|
|
|
## `dataLength` the length of data
|
|
|
|
|
## Returns:
|
|
|
|
|
## 0 on success, 1 on failure and 2 on `revert`
|
|
|
|
|
|
|
|
|
|
proc callDataCopy*(resultOffset: pointer, dataOffset, length: int32)
|
|
|
|
|
## Copies the input data in current environment to memory. This pertains to
|
|
|
|
|
## the input data passed with the message call instruction or transaction.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load data into (`bytes`)
|
|
|
|
|
## `dataOffset` the offset in the input data
|
|
|
|
|
## `length` the length of data to copy
|
|
|
|
|
|
|
|
|
|
proc getCallDataSize*(): int32
|
|
|
|
|
## Get size of input data in current environment. This pertains to the input
|
|
|
|
|
## data passed with the message call instruction or transaction.
|
|
|
|
|
##
|
|
|
|
|
## Returns: call data size
|
|
|
|
|
|
|
|
|
|
proc callCode*(gas: int64, addressOffset, valueOffset, dataOffset: pointer,
|
|
|
|
|
dataLength: int32): int32
|
|
|
|
|
## Message-call into this account with an alternative account's code.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `gas` the gas limit
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
## `valueOffset` the memory offset to load the value from (`u128`)
|
|
|
|
|
## `dataOffset` the memory offset to load data from (`bytes`)
|
|
|
|
|
## `dataLength` the length of data
|
|
|
|
|
##
|
|
|
|
|
## Returns: 0 on success, 1 on failure and 2 on `revert`
|
|
|
|
|
|
|
|
|
|
proc callDelegate*(gas: int64, addressOffset, dataOffset: pointer,
|
|
|
|
|
dataLength: int32)
|
|
|
|
|
## Message-call into this account with an alternative account’s code, but
|
|
|
|
|
## persisting the current values for sender and value.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `gas` the gas limit
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
## `dataOffset` the memory offset to load data from (`bytes`)
|
|
|
|
|
## `dataLength` the length of data
|
|
|
|
|
##
|
|
|
|
|
## Returns: 0 on success, 1 on failure and 2 on `revert`
|
|
|
|
|
|
|
|
|
|
proc callStatic*(gas: int64, addressOffset, dataOffset: pointer,
|
|
|
|
|
dataLength: int32)
|
|
|
|
|
## Sends a message with arbitrary data to a given address path, but disallow
|
|
|
|
|
## state modifications. This includes `log`, `create`, `selfdestruct` and `call`
|
|
|
|
|
## with a non-zero value.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `gas` the gas limit
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
## `dataOffset` the memory offset to load data from (`bytes`)
|
|
|
|
|
## `dataLength` the length of data
|
|
|
|
|
##
|
|
|
|
|
## Returns: 0 on success, 1 on failure and 2 on `revert`
|
|
|
|
|
|
|
|
|
|
proc storageStore*(pathOffset, valueOffset: pointer)
|
|
|
|
|
## Store 256-bit a value in memory to persistent storage
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `pathOffset` the memory offset to load the path from (`u256`)
|
|
|
|
|
## `valueOffset` the memory offset to load the value from (`u256`)
|
|
|
|
|
|
|
|
|
|
proc storageLoad*(pathOffset, valueOffset: pointer)
|
|
|
|
|
## Loads a 256-bit a value to memory from persistent storage
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `pathOffset` the memory offset to load the path from (`u256`)
|
|
|
|
|
## `resultOffset` the memory offset to store the result at (`u256`)
|
|
|
|
|
|
|
|
|
|
proc getCaller*(resultOffset: pointer)
|
|
|
|
|
## Gets caller address and loads it into memory at the given offset. This is
|
|
|
|
|
## the address of the account that is directly responsible for this execution.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the address into (`address`)
|
|
|
|
|
|
|
|
|
|
proc getCallValue*(resultOffset: pointer)
|
|
|
|
|
## Gets the deposited value by the instruction/transaction responsible for
|
|
|
|
|
## this execution and loads it into memory at the given location.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the value into (`u128`)
|
|
|
|
|
|
|
|
|
|
proc codeCopy*(resultOffset: pointer, codeOffset, length: int32)
|
|
|
|
|
## Copies the code running in current environment to memory.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the result into (`bytes`)
|
|
|
|
|
## `codeOffset` the offset within the code
|
|
|
|
|
## `length` the length of code to copy
|
|
|
|
|
|
|
|
|
|
proc getCodeSize*(): int32
|
|
|
|
|
## Gets the size of code running in current environment.
|
|
|
|
|
|
|
|
|
|
proc getBlockCoinbase*(resultOffset: pointer)
|
|
|
|
|
## Gets the block’s beneficiary address and loads into memory.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the coinbase address into (`address`)
|
|
|
|
|
|
|
|
|
|
proc create*(valueOffset, dataOffset: pointer, length: int32, resultOffset: pointer): int32
|
|
|
|
|
## Creates a new contract with a given value.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `valueOffset` the memory offset to load the value from (`u128`)
|
|
|
|
|
## `dataOffset` the memory offset to load the code for the new contract from (`bytes`)
|
|
|
|
|
## `length` the data length
|
|
|
|
|
## `resultOffset` the memory offset to write the new contract address to (`address`)
|
|
|
|
|
##
|
|
|
|
|
## Note: `create` will clear the return buffer in case of success or may fill
|
|
|
|
|
## it with data coming from `revert`.
|
|
|
|
|
##
|
|
|
|
|
## Returns: 0 on success, 1 on failure and 2 on `revert`
|
|
|
|
|
|
|
|
|
|
proc getBlockDifficulty*(resultOffset: pointer)
|
|
|
|
|
## Get the block’s difficulty.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the difficulty into (`u256`)
|
|
|
|
|
|
|
|
|
|
proc externalCodeCopy*(addressOffset, resultOffset: pointer, codeOffset, length: int32)
|
|
|
|
|
## Copies the code of an account to memory.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
## `resultOffset` the memory offset to load the result into (`bytes`)
|
|
|
|
|
## `codeOffset` the offset within the code
|
|
|
|
|
## `length` the length of code to copy
|
|
|
|
|
|
|
|
|
|
proc getExternalCodeSize*(addressOffset: pointer): int32
|
|
|
|
|
## Get size of an account’s code.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
|
|
|
|
|
proc getGasLeft*(): int64
|
|
|
|
|
## Returns the current gasCounter
|
|
|
|
|
|
|
|
|
|
proc getBlockGasLimit*(): int64
|
|
|
|
|
## Get the block’s gas limit.
|
|
|
|
|
|
|
|
|
|
proc getTxGasPrice*(valueOffset: pointer)
|
|
|
|
|
## Gets price of gas in current environment.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `valueOffset` the memory offset to write the value to (`u128`)
|
|
|
|
|
|
|
|
|
|
proc log*(dataOffset: pointer, length, numberOfTopics: int32,
|
|
|
|
|
topic1, topic2, topic3, topic4: pointer)
|
|
|
|
|
## Creates a new log in the current environment
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `dataOffset` the memory offset to load data from (`bytes`)
|
|
|
|
|
## `length` the data length
|
|
|
|
|
## `numberOfTopics` the number of topics following (0 to 4)
|
|
|
|
|
## `topic1` the memory offset to load topic1 from (`u256`)
|
|
|
|
|
## `topic2` the memory offset to load topic2 from (`u256`)
|
|
|
|
|
## `topic3` the memory offset to load topic3 from (`u256`)
|
|
|
|
|
## `topic4` the memory offset to load topic4 from (`u256`)
|
|
|
|
|
|
|
|
|
|
proc getBlockNumber*(): int64
|
|
|
|
|
## Get the block’s number.
|
|
|
|
|
|
|
|
|
|
proc getTxOrigin*(resultOffset: pointer)
|
|
|
|
|
## Gets the execution's origination address and loads it into memory at the
|
|
|
|
|
## given offset. This is the sender of original transaction; it is never an
|
|
|
|
|
## account with non-empty associated code.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load the origin address from (`address`)
|
|
|
|
|
|
|
|
|
|
proc ret*(dataOffset: pointer, length: int32) {.
|
|
|
|
|
importc: "retAux", codegenDecl: "$# $#$# __asm__(\"return\")".}
|
|
|
|
|
## Set the returning output data for the execution.
|
|
|
|
|
##
|
|
|
|
|
## Note: multiple invocations will overwrite the previous data.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `dataOffset` the memory offset of the output data (`bytes`)
|
|
|
|
|
## `length` the length of the output data
|
|
|
|
|
|
|
|
|
|
proc revert*(dataOffset: pointer, length: int32)
|
|
|
|
|
## Set the returning output data for the execution.
|
|
|
|
|
##
|
|
|
|
|
## Note: multiple invocations will overwrite the previous data.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `dataOffset` the memory offset of the output data (`bytes`)
|
|
|
|
|
## `length` the length of the output data
|
|
|
|
|
|
|
|
|
|
proc getReturnDataSize*(): int32
|
|
|
|
|
## Get size of current return data buffer to memory. This contains the return
|
|
|
|
|
## data from the last executed `call`, `callCode`, `callDelegate`, `callStatic`
|
|
|
|
|
## or `create`.
|
|
|
|
|
##
|
|
|
|
|
## Note: `create` only fills the return data buffer in case of a failure.
|
|
|
|
|
|
|
|
|
|
proc returnDataCopy*(resultOffset: pointer, dataOffset, length: int32)
|
|
|
|
|
## Copies the current return data buffer to memory. This contains the return data
|
|
|
|
|
## from last executed `call`, `callCode`, `callDelegate`, `callStatic` or `create`.
|
|
|
|
|
##
|
|
|
|
|
## Note: `create` only fills the return data buffer in case of a failure.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `resultOffset` the memory offset to load data into (`bytes`)
|
|
|
|
|
## `dataOffset` the offset in the return data
|
|
|
|
|
## `length` the length of data to copy
|
|
|
|
|
|
|
|
|
|
proc selfDestruct*(addressOffset: pointer)
|
|
|
|
|
## Mark account for later deletion and give the remaining balance to the specified
|
|
|
|
|
## beneficiary address. This takes effect once the contract execution terminates.
|
|
|
|
|
##
|
|
|
|
|
## Note: multiple invocations will overwrite the benficiary address.
|
|
|
|
|
##
|
|
|
|
|
## Note: the contract **shall** halt execution after this call.
|
|
|
|
|
##
|
|
|
|
|
## Parameters:
|
|
|
|
|
## `addressOffset` the memory offset to load the address from (`address`)
|
|
|
|
|
|
|
|
|
|
proc getBlockTimestamp*(): int64
|
|
|
|
|
## Get the block’s timestamp.
|
|
|
|
|
|
|
|
|
|
{.pop.}
|
|
|
|
|
|
|
|
|
|
proc callDataCopy*[T](res: var T, offset: int) {.inline.} =
|
|
|
|
|
callDataCopy(addr res, offset.int32, sizeof(res).int32)
|
|
|
|
|
|
|
|
|
|
proc storageLoad*[N](path: array[N, byte], res: pointer) {.inline.} =
|
|
|
|
|
when path.len < 32:
|
|
|
|
|
type PaddedPath {.packed.} = object
|
|
|
|
|
padding: array[32 - path.len, byte]
|
|
|
|
|
p: array[N, byte]
|
|
|
|
|
var p: PaddedPath
|
|
|
|
|
p.p = path
|
|
|
|
|
storageLoad(addr p, res)
|
|
|
|
|
else:
|
|
|
|
|
storageLoad(unsafeAddr path[0], res)
|
|
|
|
|
|
|
|
|
|
proc storageStore*[N](path: array[N, byte], res: pointer) {.inline.} =
|
|
|
|
|
when path.len < 32:
|
|
|
|
|
type PaddedPath {.packed.} = object
|
|
|
|
|
padding: array[32 - path.len, byte]
|
|
|
|
|
p: array[N, byte]
|
|
|
|
|
var p: PaddedPath
|
|
|
|
|
p.p = path
|
|
|
|
|
storageStore(addr p, res)
|
|
|
|
|
else:
|
|
|
|
|
storageStore(unsafeAddr path[0], res)
|
2018-07-05 08:39:04 +00:00
|
|
|
|
|
|
|
|
|
macro exportwasm*(p: untyped): untyped =
|
|
|
|
|
expectKind(p, nnkProcDef)
|
|
|
|
|
result = p
|
|
|
|
|
result.addPragma(newIdentNode("exportc"))
|
|
|
|
|
result.addPragma(newColonExpr(newIdentNode("codegenDecl"), newLit("__attribute__ ((visibility (\"default\"))) $# $#$#")))
|