mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
FunC's (and Tolk's before this PR) type system is based on Hindley-Milner. This is a common approach for functional languages, where types are inferred from usage through unification. As a result, type declarations are not necessary: () f(a,b) { return a+b; } // a and b now int, since `+` (int, int) While this approach works for now, problems arise with the introduction of new types like bool, where `!x` must handle both int and bool. It will also become incompatible with int32 and other strict integers. This will clash with structure methods, struggle with proper generics, and become entirely impractical for union types. This PR completely rewrites the type system targeting the future. 1) type of any expression is inferred and never changed 2) this is available because dependent expressions already inferred 3) forall completely removed, generic functions introduced (they work like template functions actually, instantiated while inferring) 4) instantiation `<...>` syntax, example: `t.tupleAt<int>(0)` 5) `as` keyword, for example `t.tupleAt(0) as int` 6) methods binding is done along with type inferring, not before ("before", as worked previously, was always a wrong approach)
69 lines
3.5 KiB
Text
69 lines
3.5 KiB
Text
// A part of standard library for Tolk
|
|
tolk 0.6
|
|
|
|
/**
|
|
Gas and payment related primitives.
|
|
*/
|
|
|
|
/// Returns amount of gas (in gas units) consumed in current Computation Phase.
|
|
fun getGasConsumedAtTheMoment(): int
|
|
asm "GASCONSUMED";
|
|
|
|
/// This function is required to be called when you process an external message (from an outer world)
|
|
/// and "accept" it to blockchain.
|
|
/// Without calling this function, an external message would be discarded.
|
|
/// As an effect, the current smart contract agrees to buy some gas to finish the current transaction.
|
|
/// For more details, check [accept_message effects](https://ton.org/docs/#/smart-contracts/accept).
|
|
fun acceptExternalMessage(): void
|
|
asm "ACCEPT";
|
|
|
|
/// When processing an internal message, by default, the limit of gas consumption is determined by incoming message.
|
|
/// Functions [setGasLimit] and [setGasLimitToMaximum] allow you to change this behavior.
|
|
/// Sets current gas limit `gl` to its maximal allowed value `gm`, and resets the gas credit `gc` to zero,
|
|
/// decreasing the value of `gr` by `gc` in the process.
|
|
fun setGasLimitToMaximum(): void
|
|
asm "ACCEPT";
|
|
|
|
/// When processing an internal message, by default, the limit of gas consumption is determined by incoming message.
|
|
/// Functions [setGasLimit] and [setGasLimitToMaximum] allow you to change this behavior.
|
|
/// Sets current gas limit `gl` to the minimum of limit and `gm`, and resets the gas credit `gc` to zero.
|
|
/// If the gas consumed so far (including the present instruction) exceeds the resulting value of `gl`,
|
|
/// an (unhandled) out of gas exception is thrown before setting new gas limits.
|
|
fun setGasLimit(limit: int): void
|
|
asm "SETGASLIMIT";
|
|
|
|
/// Calculates fee (amount in nanotoncoins to be paid) for a transaction which consumed [gasUsed] gas units.
|
|
fun calculateGasFee(workchain: int, gasUsed: int): int
|
|
asm(gasUsed workchain) "GETGASFEE";
|
|
|
|
/// Same as [calculateGasFee], but without flat price (you have supposed to read https://docs.ton.org/develop/howto/fees-low-level)
|
|
fun calculateGasFeeWithoutFlatPrice(workchain: int, gasUsed: int): int
|
|
asm(gasUsed workchain) "GETGASFEESIMPLE";
|
|
|
|
/// Calculates amount of nanotoncoins you should pay for storing a contract of provided size for [seconds].
|
|
/// [bits] and [cells] represent contract state (code + data).
|
|
fun calculateStorageFee(workchain: int, seconds: int, bits: int, cells: int): int
|
|
asm(cells bits seconds workchain) "GETSTORAGEFEE";
|
|
|
|
/// Calculates amount of nanotoncoins you should pay to send a message of specified size.
|
|
fun calculateMessageFee(workchain: int, bits: int, cells: int): int
|
|
asm(cells bits workchain) "GETFORWARDFEE";
|
|
|
|
/// Same as [calculateMessageFee], but without lump price (you have supposed to read https://docs.ton.org/develop/howto/fees-low-level)
|
|
fun calculateMessageFeeWithoutLumpPrice(workchain: int, bits: int, cells: int): int
|
|
asm(cells bits workchain) "GETFORWARDFEESIMPLE";
|
|
|
|
/// Calculates fee that was paid by the sender of an incoming internal message.
|
|
fun calculateOriginalMessageFee(workchain: int, incomingFwdFee: int): int
|
|
asm(incomingFwdFee workchain) "GETORIGINALFWDFEE";
|
|
|
|
/// Returns the amount of nanotoncoins current contract debts for storage. ("due" and "debt" are synonyms)
|
|
/// If it has no debt, `0` is returned.
|
|
fun getMyStorageDuePayment(): int
|
|
asm "DUEPAYMENT";
|
|
|
|
/// Returns the amount of nanotoncoins charged for storage.
|
|
/// (during storage phase preceeding to current computation phase)
|
|
@pure
|
|
fun getMyStoragePaidPayment(): int
|
|
asm "STORAGEFEES";
|