diff --git a/src/abi/struct.ts b/src/abi/struct.ts index 84594773f6..ad9a9e06fa 100644 --- a/src/abi/struct.ts +++ b/src/abi/struct.ts @@ -265,4 +265,63 @@ export const StructFunctions: Map = new Map([ }, }, ], + [ + "loadFromSlice", + { + name: "loadFromSlice", + resolve: (ctx, args, ref) => { + if (args.length !== 2) { + throwCompilationError( + "loadFromSlice() expects one argument", + ref, + ); + } + const arg0 = args[0]!; + const arg1 = args[1]!; + if (arg0.kind !== "ref") { + throwCompilationError( + "loadFromSlice() is implemented only for struct types", + ref, + ); + } + const tp = getType(ctx, arg0.name); + if (tp.kind !== "struct") { + throwCompilationError( + "loadFromSlice() is implemented only for struct types", + ref, + ); + } + if (arg1.kind !== "ref" || arg1.name !== "Slice") { + throwCompilationError( + "loadFromSlice() expects a Slice as an argument", + ref, + ); + } + return { kind: "ref", name: arg0.name, optional: false }; + }, + generate: (ctx, args, resolved, ref) => { + if (resolved.length !== 2) { + throwCompilationError( + "loadFromSlice() expects one argument", + ref, + ); + } + const arg0 = args[0]!; + const arg1 = args[1]!; + if (arg0.kind !== "ref") { + throwCompilationError( + "loadFromSlice() is implemented only for struct types", + ref, + ); + } + if (arg1.kind !== "ref" || arg1.name !== "Slice") { + throwCompilationError( + "loadFromSlice() expects a Slice as an argument", + ref, + ); + } + return `${writeExpression(resolved[1]!, ctx)}~${ops.readerModifying(arg0.name, ctx)}()`; + }, + }, + ], ]); diff --git a/src/generator/writers/ops.ts b/src/generator/writers/ops.ts index ca7e683339..aa22543f94 100644 --- a/src/generator/writers/ops.ts +++ b/src/generator/writers/ops.ts @@ -27,6 +27,8 @@ export const ops = { }, readerNonModifying: (type: string, ctx: WriterContext) => used(`$${type}$_load_not_mut`, ctx), + readerModifying: (type: string, ctx: WriterContext) => + used(`$${type}$_load`, ctx), readerBounced: (type: string, ctx: WriterContext) => used(`$${type}$_load_bounced`, ctx), readerOpt: (type: string, ctx: WriterContext) => diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index 08cf1c9d2c..687f63d786 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -2667,62 +2667,73 @@ files["std/stubs.tact"] = "aGUgc3BlY2lmaWVkIGBNZXNzYWdlYCBvciB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFj" + "dC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscy8jbWVzc2FnZWZyb21zbGljZQovLy8KLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jv" + "b2svZXhpdC1jb2RlcyM5Ci8vLwpmdW4gQW55TWVzc2FnZV9mcm9tU2xpY2Uoc2xpY2U6IFNsaWNlKTogTTsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIGFueSBN" + - "ZXNzYWdlIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi43LgovLy8KLy8vIFJldHVybnMgdGhlIG1lc3NhZ2Ugb3Bjb2RlLgovLy8KLy8vIGBgYHRhY3QKLy8v" + - "IG1lc3NhZ2UoMHg3NzcpIFRyaXBsZUF4ZSB7Ci8vLyAgICAgcHJpemU6IEludCBhcyB1aW50MzI7Ci8vLyB9Ci8vLwovLy8gY29udHJhY3QgRXhhbXBsZSB7Ci8vLyAg" + - "ICAgcmVjZWl2ZShtc2c6IFRyaXBsZUF4ZSkgewovLy8gICAgICAgICBkdW1wKFRyaXBsZUF4ZS5vcGNvZGUoKSk7IC8vIDB4Nzc3Ci8vLyAgICB9Ci8vLyB9Ci8vLyBg" + - "YGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzLyNtZXNzYWdlb3Bjb2RlCi8vLwpmdW4gQW55TWVzc2FnZV9vcGNv" + - "ZGUoKTogSW50OwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgYW55IFN0cnVjdC4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgU3RydWN0IHRvIGEgYENlbGxgIGFuZCBy" + - "ZXR1cm5zIGl0LgovLy8KLy8vIGBgYHRhY3QKLy8vIHN0cnVjdCBHdWVzc0NvaW4gewovLy8gICAgIHByb2JhYmx5OiBJbnQgYXMgY29pbnM7Ci8vLyAgICAgbm90aGlu" + - "ZzogSW50IGFzIGNvaW5zOwovLy8gfQovLy8KLy8vIGZ1biBjb2luQ2VsbCgpOiBDZWxsIHsKLy8vICAgICBsZXQgczogR3Vlc3NDb2luID0gR3Vlc3NDb2lueyBwcm9i" + - "YWJseTogNDIsIG5vdGhpbmc6IDI3IH07Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzLnRvQ2VsbCgpOwovLy8KLy8vICAgICByZXR1cm4gZml6ejsgLy8gInh7MTJB" + - "MTFCfSIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMvI3N0cnVjdHRvY2VsbAovLy8KZXh0" + - "ZW5kcyBmdW4gdG9DZWxsKHNlbGY6IEFueVN0cnVjdCk6IENlbGw7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciBhbnkgU3RydWN0LiBBdmFpbGFibGUgc2luY2Ug" + - "VGFjdCAxLjUuMC4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgU3RydWN0IHRvIGEgYFNsaWNlYCBhbmQgcmV0dXJucyBpdC4gQWxpYXMgdG8gYHNlbGYudG9DZWxsKCkuYXNT" + - "bGljZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBzdHJ1Y3QgR3Vlc3NDb2luIHsKLy8vICAgICBwcm9iYWJseTogSW50IGFzIGNvaW5zOwovLy8gICAgIG5vdGhpbmc6" + - "IEludCBhcyBjb2luczsKLy8vIH0KLy8vCi8vLyBmdW4gY29pblNsaWNlKCk6IFNsaWNlIHsKLy8vICAgICBsZXQgczogR3Vlc3NDb2luID0gR3Vlc3NDb2lueyBwcm9i" + - "YWJseTogNDIsIG5vdGhpbmc6IDI3IH07Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gcy50b1NsaWNlKCk7Ci8vLwovLy8gICAgIHJldHVybiBmaXp6OyAvLyAiQ1N7" + - "Q2VsbHswMDA2MTJhMTFifSBiaXRzOiAwLi4yNDsgcmVmczogMC4uMH0iCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" + - "L3JlZi9jb3JlLWNlbGxzLyNzdHJ1Y3R0b3NsaWNlCi8vLwpleHRlbmRzIGZ1biB0b1NsaWNlKHNlbGY6IEFueVN0cnVjdCk6IFNsaWNlOwoKLy8vIEV4dGVuc2lvbiBm" + - "dW5jdGlvbiBmb3IgYW55IE1lc3NhZ2UuCi8vLwovLy8gQ29udmVydHMgdGhlIE1lc3NhZ2UgdG8gYSBgQ2VsbGAgYW5kIHJldHVybnMgaXQuCi8vLwovLy8gYGBgdGFj" + - "dAovLy8gbWVzc2FnZSBHdWVzc0NvaW4gewovLy8gICAgIHByb2JhYmx5OiBJbnQgYXMgY29pbnM7Ci8vLyAgICAgbm90aGluZzogSW50IGFzIGNvaW5zOwovLy8gfQov" + - "Ly8KLy8vIGZ1biBjb2luQ2VsbCgpOiBDZWxsIHsKLy8vICAgICBsZXQgczogR3Vlc3NDb2luID0gR3Vlc3NDb2lueyBwcm9iYWJseTogNDIsIG5vdGhpbmc6IDI3IH07" + - "Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzLnRvQ2VsbCgpOwovLy8KLy8vICAgICByZXR1cm4gZml6ejsgLy8gInh7QUIzNzEwNzcxMkExMUJ9IgovLy8gfQovLy8g" + - "YGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscy8jbWVzc2FnZXRvY2VsbAovLy8KZXh0ZW5kcyBmdW4gdG9DZWxs" + - "KHNlbGY6IEFueU1lc3NhZ2UpOiBDZWxsOwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgYW55IE1lc3NhZ2UuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgov" + - "Ly8KLy8vIENvbnZlcnRzIHRoZSBNZXNzYWdlIHRvIGEgYFNsaWNlYCBhbmQgcmV0dXJucyBpdC4gQWxpYXMgdG8gYHNlbGYudG9DZWxsKCkuYXNTbGljZSgpYC4KLy8v" + - "Ci8vLyBgYGB0YWN0Ci8vLyBtZXNzYWdlIEd1ZXNzQ29pbiB7Ci8vLyAgICAgcHJvYmFibHk6IEludCBhcyBjb2luczsKLy8vICAgICBub3RoaW5nOiBJbnQgYXMgY29p" + - "bnM7Ci8vLyB9Ci8vLwovLy8gZnVuIGNvaW5TbGljZSgpOiBTbGljZSB7Ci8vLyAgICAgbGV0IHM6IEd1ZXNzQ29pbiA9IEd1ZXNzQ29pbnsgcHJvYmFibHk6IDQyLCBu" + - "b3RoaW5nOiAyNyB9OwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMudG9TbGljZSgpOwovLy8KLy8vICAgICByZXR1cm4gZml6ejsgLy8gIkNTe0NlbGx7MDAwZWFi" + - "MzcxMDc3MTJhMTFifSBiaXRzOiAwLi41NjsgcmVmczogMC4uMH0iCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3Jl" + - "Zi9jb3JlLWNlbGxzLyNtZXNzYWdldG9zbGljZQovLy8KZXh0ZW5kcyBmdW4gdG9TbGljZShzZWxmOiBBbnlNZXNzYWdlKTogU2xpY2U7CgovLy8gQ3JlYXRlcyBhbiBl" + - "bXB0eSBtYXAgb2YgdHlwZSBgbWFwPEssIFY+YCwgaW5pdGlhbGx5IHNldCB0byBgbnVsbGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAg" + - "ICAgbGV0IGVudHJpZXM6IG1hcDxJbnQsIFN0cmluZz4gPSBlbXB0eU1hcCgpOwovLy8gICAgIC8vICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eIG5vdGUgdGhhdCB5" + - "b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBrZXkgYW5kCi8vLyAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdHlwZXMgaW4gdGhlIHR5cGUgYW5u" + - "b3RhdGlvbiB3aGVuCi8vLyAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyaW5nIHRoZSBtYXAgdmFyaWFibGUKLy8vIH0KLy8vIGBgYAovLy8K" + - "Ly8vIE9uIFRWTSwgbWFwcyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBgQ2VsbGAgdHlwZSwgd2hpY2ggaXMgdmVyeSBnYXMtaW50ZW5zaXZlLgovLy8KLy8vIFNlZTogaHR0" + - "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNlbXB0eW1hcAovLy8KZnVuIGVtcHR5TWFwKCk6IG1hcDxLLCBWPjsKCi8vLyBTZXRzIG9yIHJlcGxhY2Vz" + - "IGEgdmFsdWUgYHZhbGAgdW5kZXIgYSBga2V5YCBpbiB0aGUgbWFwLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNzZXQK" + - "Ly8vCmV4dGVuZHMgbXV0YXRlcyBmdW4gc2V0KHNlbGY6IG1hcDxLLCBWPiwga2V5OiBLLCB2YWw6IFY/KTsKCi8vLyBHZXRzIGEgdmFsdWUgYnkgaXRzIGBrZXlgIGZy" + - "b20gdGhlIG1hcC4gUmV0dXJucyBgbnVsbGAgaWYgdGhlIGBrZXlgIGlzIG1pc3NpbmcsCi8vLyBvciB0aGUgdmFsdWUgaWYgdGhlIGBrZXlgIGlzIGZvdW5kLgovLy8K" + - "Ly8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNnZXQKLy8vCmV4dGVuZHMgZnVuIGdldChzZWxmOiBtYXA8SywgVj4sIGtleTogSyk6" + - "IFY/OwoKLy8vIFJlcGxhY2VzIGEgdmFsdWUgYHZhbGAgdW5kZXIgdGhlIHNwZWNpZmllZCBga2V5YAovLy8gaWYgc3VjaCBrZXkgZXhpc3RzLiBSZXR1cm5zIGB0cnVl" + - "YCBvbiBzdWNjZXNzZnVsIHJlcGxhY2VtZW50IGFuZCBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" + - "bWFwcy8jcmVwbGFjZQovLy8KZXh0ZW5kcyBtdXRhdGVzIGZ1biByZXBsYWNlKHNlbGY6IG1hcDxLLCBWPiwga2V5OiBLLCB2YWw6IFYpOiBCb29sOwoKLy8vIExpa2Ug" + - "YHJlcGxhY2UoKWAsIGJ1dCByZXR1cm5zIHRoZSBvbGQgKHByZS1yZXBsYWNlbWVudCkgdmFsdWUKLy8vIG9uIHN1Y2Nlc3NmdWwgcmVwbGFjZW1lbnQgYW5kIGBudWxs" + - "YCBvdGhlcndpc2UuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21hcHMvI3JlcGxhY2VnZXQKLy8vCmV4dGVuZHMgbXV0YXRlcyBm" + - "dW4gcmVwbGFjZUdldChzZWxmOiBtYXA8SywgVj4sIGtleTogSywgdmFsOiBWKTogVj87CgovLy8gRGVsZXRlcyBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciAoc2luZ2xl" + - "IGVudHJ5KSBieSBpdHMgYGtleWAKLy8vIGZyb20gdGhlIG1hcC4gUmV0dXJucyBgdHJ1ZWAgaW4gY2FzZSBvZiBzdWNjZXNzZnVsIGRlbGV0aW9uIGFuZCBgZmFsc2Vg" + - "IG90aGVyd2lzZS4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWFwcy8jZGVsCi8vLwpleHRlbmRzIG11dGF0ZXMgZnVuIGRlbChz" + - "ZWxmOiBtYXA8SywgVj4sIGtleTogSyk6IEJvb2w7CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIHVuZGVyIHRoZSBnaXZlbiBga2V5YCBleGlzdHMgaW4g" + - "dGhlIG1hcCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gVGhpcyBmdW5jdGlvbiBpcyBtb3JlIGdhcy1lZmZpY2llbnQgdGhhbiBjaGVja2luZyBgc2VsZi5n" + - "ZXQoa2V5KSAhPSBudWxsYC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWFwcy8jZXhpc3RzCi8vLwpleHRlbmRzIGZ1biBleGlz" + - "dHMoc2VsZjogbWFwPEssIFY+LCBrZXk6IEspOiBCb29sOwoKLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBtYXAgaXMgZW1wdHkgYW5kIGBmYWxzZWAgb3RoZXJ3aXNl" + - "LgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNpc2VtcHR5Ci8vLwpleHRlbmRzIGZ1biBpc0VtcHR5KHNlbGY6IG1hcDxL" + - "LCBWPik6IEJvb2w7CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVudHJpZXMgb2YgdGhlIG1hcCBtYXRjaCBjb3JyZXNwb25kaW5nIGVudHJpZXMgb2YgYW5vdGhl" + - "ciBtYXAsCi8vLyBpZ25vcmluZyBwb3NzaWJsZSBkaWZmZXJlbmNlcyBpbiB0aGUgdW5kZXJseWluZyBzZXJpYWxpemF0aW9uIGxvZ2ljLiBSZXR1cm5zIGBmYWxzZWAg" + - "b3RoZXJ3aXNlLgovLy8KLy8vIFRoaXMgZnVuY3Rpb24gaXMgdmVyeSBnYXMgZXhwZW5zaXZlLCBwcmVmZXIgYD09YCBvcGVyYXRvciBmb3Igc2ltcGxlIGNvbXBhcmlz" + - "b25zLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNkZWVwZXF1YWxzCi8vLwpleHRlbmRzIGZ1biBkZWVwRXF1YWxzKHNl" + - "bGY6IG1hcDxLLCBWPiwgb3RoZXI6IG1hcDxLLCBWPik6IEJvb2w7CgovLy8gQ29udmVydHMgdGhlIG1hcCB0byBpdHMgdW5kZXJseWluZyBgQ2VsbGAgcmVwcmVzZW50" + - "YXRpb24uCi8vLwovLy8gU2luY2UgbWFwcyBhcmUgaW5pdGlhbGl6ZWQgdG8gYG51bGxgLCBjYWxsaW5nIGBhc0NlbGwoKWAgb24gYSBtYXAKLy8vIHdpdGggbm8gdmFs" + - "dWVzIGFzc2lnbmVkIHdpbGwgcmV0dXJuIGBudWxsYCBhbmQgKipub3QqKiBhbiBlbXB0eSBgQ2VsbGAuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5n" + - "Lm9yZy9ib29rL21hcHMvI2FzY2VsbAovLy8KZXh0ZW5kcyBmdW4gYXNDZWxsKHNlbGY6IG1hcDxLLCBWPik6IENlbGw/Owo="; + "ZXNzYWdlIHR5cGUuCi8vLwovLy8gQ29udmVydHMgYSBgU2xpY2VgIGludG8gdGhlIHNwZWNpZmllZCBgTWVzc2FnZWAgYW5kIHJldHVybnMgdGhhdCBgTWVzc2FnZWAg" + + "bW9kaWZ5aW5nIGBTbGljZWAuCi8vLwovLy8gYGBgdGFjdAovLy8gbWVzc2FnZSgweDc3NykgVHJpcGxlQXhlIHsKLy8vICAgICBwcml6ZTogSW50IGFzIHVpbnQzMjsK" + + "Ly8vIH0KLy8vCi8vLyBmdW4gZGlyZWN0UGFyc2UocGF5bG9hZDogU2xpY2UpOiBUcmlwbGVBeGUgewovLy8gICAgIHJldHVybiBUcmlwbGVBeGUuZnJvbVNsaWNlKHBh" + + "eWxvYWQpOwovLy8gfQovLy8KLy8vIGZ1biBjYXV0aW91c1BhcnNlKHBheWxvYWQxOiBTbGljZSk6IFRyaXBsZUF4ZT8gewovLy8gICAgIGxldCBjb2luOiBUcmlwbGVB" + + "eGU/ID0gbnVsbDsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBjb2luID0gVHJpcGxlQXhlLmxvYWRGcm9tU2xpY2UocGF5bG9hZCk7Ci8vLyAgICAgICAgIHRocm93" + + "VW5sZXNzKDExMTEsIHBheWxvYWQuYml0cygpID09IDApOwovLy8gICAgIH0gY2F0Y2ggKGUpIHsKLy8vICAgICAgICAgZHVtcCgiU2xpY2UgcGF5bG9hZCBkb2Vzbid0" + + "IG1hdGNoIFRyaXBsZUF4ZSBNZXNzYWdlISIpOwovLy8gICAgIH0KLy8vICAgICByZXR1cm4gY29pbjsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2Rl" + + "cwovLy8KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwYXNzIGEgYFNsaWNlYCB3aXRoIGEgbGF5b3V0IGRpZmZl" + + "cmVudAovLy8gZnJvbSB0aGUgc3BlY2lmaWVkIGBNZXNzYWdlYCBvciB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOiBo" + + "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscy8jbWVzc2FnZWZyb21zbGljZQovLy8KLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50" + + "YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpmdW4gQW55TWVzc2FnZV9sb2FkRnJvbVNsaWNlKHNsaWNlOiBTbGljZSk6IE07CgovLy8gRXh0ZW5zaW9u" + + "IGZ1bmN0aW9uIGZvciBhbnkgTWVzc2FnZSB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuNy4KLy8vCi8vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIG9wY29kZS4K" + + "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBtZXNzYWdlKDB4Nzc3KSBUcmlwbGVBeGUgewovLy8gICAgIHByaXplOiBJbnQgYXMgdWludDMyOwovLy8gfQovLy8KLy8vIGNvbnRy" + + "YWN0IEV4YW1wbGUgewovLy8gICAgIHJlY2VpdmUobXNnOiBUcmlwbGVBeGUpIHsKLy8vICAgICAgICAgZHVtcChUcmlwbGVBeGUub3Bjb2RlKCkpOyAvLyAweDc3Nwov" + + "Ly8gICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscy8jbWVzc2FnZW9wY29kZQovLy8K" + + "ZnVuIEFueU1lc3NhZ2Vfb3Bjb2RlKCk6IEludDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIGFueSBTdHJ1Y3QuCi8vLwovLy8gQ29udmVydHMgdGhlIFN0cnVj" + + "dCB0byBhIGBDZWxsYCBhbmQgcmV0dXJucyBpdC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBzdHJ1Y3QgR3Vlc3NDb2luIHsKLy8vICAgICBwcm9iYWJseTogSW50IGFzIGNv" + + "aW5zOwovLy8gICAgIG5vdGhpbmc6IEludCBhcyBjb2luczsKLy8vIH0KLy8vCi8vLyBmdW4gY29pbkNlbGwoKTogQ2VsbCB7Ci8vLyAgICAgbGV0IHM6IEd1ZXNzQ29p" + + "biA9IEd1ZXNzQ29pbnsgcHJvYmFibHk6IDQyLCBub3RoaW5nOiAyNyB9OwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gcy50b0NlbGwoKTsKLy8vCi8vLyAgICAgcmV0" + + "dXJuIGZpeno7IC8vICJ4ezEyQTExQn0iCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzLyNz" + + "dHJ1Y3R0b2NlbGwKLy8vCmV4dGVuZHMgZnVuIHRvQ2VsbChzZWxmOiBBbnlTdHJ1Y3QpOiBDZWxsOwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgYW55IFN0cnVj" + + "dC4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQ29udmVydHMgdGhlIFN0cnVjdCB0byBhIGBTbGljZWAgYW5kIHJldHVybnMgaXQuIEFsaWFzIHRv" + + "IGBzZWxmLnRvQ2VsbCgpLmFzU2xpY2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gc3RydWN0IEd1ZXNzQ29pbiB7Ci8vLyAgICAgcHJvYmFibHk6IEludCBhcyBjb2lu" + + "czsKLy8vICAgICBub3RoaW5nOiBJbnQgYXMgY29pbnM7Ci8vLyB9Ci8vLwovLy8gZnVuIGNvaW5TbGljZSgpOiBTbGljZSB7Ci8vLyAgICAgbGV0IHM6IEd1ZXNzQ29p" + + "biA9IEd1ZXNzQ29pbnsgcHJvYmFibHk6IDQyLCBub3RoaW5nOiAyNyB9OwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMudG9TbGljZSgpOwovLy8KLy8vICAgICBy" + + "ZXR1cm4gZml6ejsgLy8gIkNTe0NlbGx7MDAwNjEyYTExYn0gYml0czogMC4uMjQ7IHJlZnM6IDAuLjB9IgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczov" + + "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscy8jc3RydWN0dG9zbGljZQovLy8KZXh0ZW5kcyBmdW4gdG9TbGljZShzZWxmOiBBbnlTdHJ1Y3QpOiBTbGlj" + + "ZTsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIGFueSBNZXNzYWdlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBNZXNzYWdlIHRvIGEgYENlbGxgIGFuZCByZXR1cm5z" + + "IGl0LgovLy8KLy8vIGBgYHRhY3QKLy8vIG1lc3NhZ2UgR3Vlc3NDb2luIHsKLy8vICAgICBwcm9iYWJseTogSW50IGFzIGNvaW5zOwovLy8gICAgIG5vdGhpbmc6IElu" + + "dCBhcyBjb2luczsKLy8vIH0KLy8vCi8vLyBmdW4gY29pbkNlbGwoKTogQ2VsbCB7Ci8vLyAgICAgbGV0IHM6IEd1ZXNzQ29pbiA9IEd1ZXNzQ29pbnsgcHJvYmFibHk6" + + "IDQyLCBub3RoaW5nOiAyNyB9OwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gcy50b0NlbGwoKTsKLy8vCi8vLyAgICAgcmV0dXJuIGZpeno7IC8vICJ4e0FCMzcxMDc3" + + "MTJBMTFCfSIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMvI21lc3NhZ2V0b2NlbGwKLy8v" + + "CmV4dGVuZHMgZnVuIHRvQ2VsbChzZWxmOiBBbnlNZXNzYWdlKTogQ2VsbDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIGFueSBNZXNzYWdlLiBBdmFpbGFibGUg" + + "c2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgTWVzc2FnZSB0byBhIGBTbGljZWAgYW5kIHJldHVybnMgaXQuIEFsaWFzIHRvIGBzZWxmLnRvQ2Vs" + + "bCgpLmFzU2xpY2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gbWVzc2FnZSBHdWVzc0NvaW4gewovLy8gICAgIHByb2JhYmx5OiBJbnQgYXMgY29pbnM7Ci8vLyAgICAg" + + "bm90aGluZzogSW50IGFzIGNvaW5zOwovLy8gfQovLy8KLy8vIGZ1biBjb2luU2xpY2UoKTogU2xpY2UgewovLy8gICAgIGxldCBzOiBHdWVzc0NvaW4gPSBHdWVzc0Nv" + + "aW57IHByb2JhYmx5OiA0Miwgbm90aGluZzogMjcgfTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLnRvU2xpY2UoKTsKLy8vCi8vLyAgICAgcmV0dXJuIGZpeno7" + + "IC8vICJDU3tDZWxsezAwMGVhYjM3MTA3NzEyYTExYn0gYml0czogMC4uNTY7IHJlZnM6IDAuLjB9IgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2Rv" + + "Y3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscy8jbWVzc2FnZXRvc2xpY2UKLy8vCmV4dGVuZHMgZnVuIHRvU2xpY2Uoc2VsZjogQW55TWVzc2FnZSk6IFNsaWNl" + + "OwoKLy8vIENyZWF0ZXMgYW4gZW1wdHkgbWFwIG9mIHR5cGUgYG1hcDxLLCBWPmAsIGluaXRpYWxseSBzZXQgdG8gYG51bGxgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1" + + "biBleGFtcGxlKCkgewovLy8gICAgIGxldCBlbnRyaWVzOiBtYXA8SW50LCBTdHJpbmc+ID0gZW1wdHlNYXAoKTsKLy8vICAgICAvLyAgICAgICAgICAgXl5eXl5eXl5e" + + "Xl5eXl5eXiBub3RlIHRoYXQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUga2V5IGFuZAovLy8gICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHR5" + + "cGVzIGluIHRoZSB0eXBlIGFubm90YXRpb24gd2hlbgovLy8gICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmluZyB0aGUgbWFwIHZhcmlhYmxl" + + "Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBPbiBUVk0sIG1hcHMgYXJlIHJlcHJlc2VudGVkIGFzIGEgYENlbGxgIHR5cGUsIHdoaWNoIGlzIHZlcnkgZ2FzLWludGVuc2l2" + + "ZS4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWFwcy8jZW1wdHltYXAKLy8vCmZ1biBlbXB0eU1hcCgpOiBtYXA8SywgVj47Cgov" + + "Ly8gU2V0cyBvciByZXBsYWNlcyBhIHZhbHVlIGB2YWxgIHVuZGVyIGEgYGtleWAgaW4gdGhlIG1hcC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + + "b3JnL2Jvb2svbWFwcy8jc2V0Ci8vLwpleHRlbmRzIG11dGF0ZXMgZnVuIHNldChzZWxmOiBtYXA8SywgVj4sIGtleTogSywgdmFsOiBWPyk7CgovLy8gR2V0cyBhIHZh" + + "bHVlIGJ5IGl0cyBga2V5YCBmcm9tIHRoZSBtYXAuIFJldHVybnMgYG51bGxgIGlmIHRoZSBga2V5YCBpcyBtaXNzaW5nLAovLy8gb3IgdGhlIHZhbHVlIGlmIHRoZSBg" + + "a2V5YCBpcyBmb3VuZC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWFwcy8jZ2V0Ci8vLwpleHRlbmRzIGZ1biBnZXQoc2VsZjog" + + "bWFwPEssIFY+LCBrZXk6IEspOiBWPzsKCi8vLyBSZXBsYWNlcyBhIHZhbHVlIGB2YWxgIHVuZGVyIHRoZSBzcGVjaWZpZWQgYGtleWAKLy8vIGlmIHN1Y2gga2V5IGV4" + + "aXN0cy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzc2Z1bCByZXBsYWNlbWVudCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3Mu" + + "dGFjdC1sYW5nLm9yZy9ib29rL21hcHMvI3JlcGxhY2UKLy8vCmV4dGVuZHMgbXV0YXRlcyBmdW4gcmVwbGFjZShzZWxmOiBtYXA8SywgVj4sIGtleTogSywgdmFsOiBW" + + "KTogQm9vbDsKCi8vLyBMaWtlIGByZXBsYWNlKClgLCBidXQgcmV0dXJucyB0aGUgb2xkIChwcmUtcmVwbGFjZW1lbnQpIHZhbHVlCi8vLyBvbiBzdWNjZXNzZnVsIHJl" + + "cGxhY2VtZW50IGFuZCBgbnVsbGAgb3RoZXJ3aXNlLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNyZXBsYWNlZ2V0Ci8v" + + "LwpleHRlbmRzIG11dGF0ZXMgZnVuIHJlcGxhY2VHZXQoc2VsZjogbWFwPEssIFY+LCBrZXk6IEssIHZhbDogVik6IFY/OwoKLy8vIERlbGV0ZXMgYSBzaW5nbGUga2V5" + + "LXZhbHVlIHBhaXIgKHNpbmdsZSBlbnRyeSkgYnkgaXRzIGBrZXlgCi8vLyBmcm9tIHRoZSBtYXAuIFJldHVybnMgYHRydWVgIGluIGNhc2Ugb2Ygc3VjY2Vzc2Z1bCBk" + + "ZWxldGlvbiBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21hcHMvI2RlbAovLy8KZXh0ZW5k" + + "cyBtdXRhdGVzIGZ1biBkZWwoc2VsZjogbWFwPEssIFY+LCBrZXk6IEspOiBCb29sOwoKLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSB1bmRlciB0aGUgZ2l2" + + "ZW4gYGtleWAgZXhpc3RzIGluIHRoZSBtYXAgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBnYXMtZWZmaWNpZW50IHRo" + + "YW4gY2hlY2tpbmcgYHNlbGYuZ2V0KGtleSkgIT0gbnVsbGAuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21hcHMvI2V4aXN0cwov" + + "Ly8KZXh0ZW5kcyBmdW4gZXhpc3RzKHNlbGY6IG1hcDxLLCBWPiwga2V5OiBLKTogQm9vbDsKCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWFwIGlzIGVtcHR5IGFu" + + "ZCBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWFwcy8jaXNlbXB0eQovLy8KZXh0ZW5kcyBmdW4g" + + "aXNFbXB0eShzZWxmOiBtYXA8SywgVj4pOiBCb29sOwoKLy8vIFJldHVybnMgYHRydWVgIGlmIGFsbCBlbnRyaWVzIG9mIHRoZSBtYXAgbWF0Y2ggY29ycmVzcG9uZGlu" + + "ZyBlbnRyaWVzIG9mIGFub3RoZXIgbWFwLAovLy8gaWdub3JpbmcgcG9zc2libGUgZGlmZmVyZW5jZXMgaW4gdGhlIHVuZGVybHlpbmcgc2VyaWFsaXphdGlvbiBsb2dp" + + "Yy4gUmV0dXJucyBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgZ2FzIGV4cGVuc2l2ZSwgcHJlZmVyIGA9PWAgb3BlcmF0b3Ig" + + "Zm9yIHNpbXBsZSBjb21wYXJpc29ucy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWFwcy8jZGVlcGVxdWFscwovLy8KZXh0ZW5k" + + "cyBmdW4gZGVlcEVxdWFscyhzZWxmOiBtYXA8SywgVj4sIG90aGVyOiBtYXA8SywgVj4pOiBCb29sOwoKLy8vIENvbnZlcnRzIHRoZSBtYXAgdG8gaXRzIHVuZGVybHlp" + + "bmcgYENlbGxgIHJlcHJlc2VudGF0aW9uLgovLy8KLy8vIFNpbmNlIG1hcHMgYXJlIGluaXRpYWxpemVkIHRvIGBudWxsYCwgY2FsbGluZyBgYXNDZWxsKClgIG9uIGEg" + + "bWFwCi8vLyB3aXRoIG5vIHZhbHVlcyBhc3NpZ25lZCB3aWxsIHJldHVybiBgbnVsbGAgYW5kICoqbm90KiogYW4gZW1wdHkgYENlbGxgLgovLy8KLy8vIFNlZTogaHR0" + + "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tYXBzLyNhc2NlbGwKLy8vCmV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBtYXA8SywgVj4pOiBDZWxsPzsK"; diff --git a/src/stdlib/stdlib/std/stubs.tact b/src/stdlib/stdlib/std/stubs.tact index 5ca77f174f..2f1c8be5bc 100644 --- a/src/stdlib/stdlib/std/stubs.tact +++ b/src/stdlib/stdlib/std/stubs.tact @@ -394,6 +394,42 @@ fun AnyMessage_fromCell(cell: Cell): M; /// fun AnyMessage_fromSlice(slice: Slice): M; +/// Extension function for any Message type. +/// +/// Converts a `Slice` into the specified `Message` and returns that `Message` modifying `Slice`. +/// +/// ```tact +/// message(0x777) TripleAxe { +/// prize: Int as uint32; +/// } +/// +/// fun directParse(payload: Slice): TripleAxe { +/// return TripleAxe.fromSlice(payload); +/// } +/// +/// fun cautiousParse(payload1: Slice): TripleAxe? { +/// let coin: TripleAxe? = null; +/// try { +/// coin = TripleAxe.loadFromSlice(payload); +/// throwUnless(1111, payload.bits() == 0); +/// } catch (e) { +/// dump("Slice payload doesn't match TripleAxe Message!"); +/// } +/// return coin; +/// } +/// ``` +/// +/// #### Exit codes +/// +/// * 9: [Cell underflow] — Thrown when attempting to pass a `Slice` with a layout different +/// from the specified `Message` or to load more data than `Slice` contains. +/// +/// See: https://docs.tact-lang.org/ref/core-cells/#messagefromslice +/// +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 +/// +fun AnyMessage_loadFromSlice(slice: Slice): M; + /// Extension function for any Message type. Available since Tact 1.6.7. /// /// Returns the message opcode.