Skip to content

Commit 54a0855

Browse files
committed
Fixed cast address => string
1 parent 7b6855b commit 54a0855

File tree

3 files changed

+95
-3
lines changed

3 files changed

+95
-3
lines changed

Library/src/CodeGen/Libraries.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public static LibraryDeclaration LoadLibrary(string name, Scope scope, ModuleKin
273273
libDecl.AddMethod("isSystem", MethodImplementationType.Custom, VarKind.Bool, new[] { new MethodParameter("target", VarKind.Address) });
274274
libDecl.AddMethod("isInterop", MethodImplementationType.Custom, VarKind.Bool, new[] { new MethodParameter("target", VarKind.Address) });
275275

276-
GenerateCasts(libDecl, VarKind.Bytes, new VarKind[] { VarKind.String });
276+
GenerateCasts(libDecl, VarKind.Address, new VarKind[] { VarKind.String });
277277

278278
return libDecl;
279279
}
Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,90 @@
11
namespace TOMBLib.Tests.CodeGen;
22

3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using NUnit.Framework;
6+
using Phantasma.Core.Cryptography.Structs;
7+
using Phantasma.Core.Domain;
8+
using Phantasma.Core.Domain.Execution.Enums;
9+
using Phantasma.Core.Domain.VM;
10+
using Phantasma.Core.Utils;
11+
using Phantasma.Tomb.Compilers;
12+
313
public class CodeGeneratorTests
4-
{
5-
14+
{
15+
[Test]
16+
public void AutoCasts()
17+
{
18+
var sourceCode =
19+
@"
20+
contract test {
21+
import Address;
22+
23+
public castTest(x:address): string {
24+
return Address.toString(x);
25+
}
26+
}";
27+
28+
var parser = new TombLangCompiler();
29+
var contract = parser.Process(sourceCode).First();
30+
31+
var storage = new Dictionary<byte[], byte[]>(new ByteArrayComparer());
32+
33+
var cast = contract.abi.FindMethod("castTest");
34+
Assert.IsNotNull(cast);
35+
36+
var expected = "P2K7GyVMC3f9XxKRji5gfg91WvutoHs2RyB6KzQxuaAUUeo";
37+
var addr = Address.FromText(expected);
38+
39+
var vm = new TestVM(contract, storage, cast);
40+
vm.Stack.Push(VMObject.FromObject(addr));
41+
var result = vm.Execute();
42+
Assert.IsTrue(result == ExecutionState.Halt);
43+
44+
Assert.IsTrue(vm.Stack.Count == 1);
45+
var val = vm.Stack.Pop().AsString();
46+
Assert.IsTrue(val == expected);
47+
}
48+
49+
[Test]
50+
public void IfWithOr()
51+
{
52+
var sourceCode =
53+
@"
54+
contract test {
55+
public check(x:number, y:number): bool {
56+
return (x > 0) && (y < 0);
57+
}
58+
}";
59+
60+
var parser = new TombLangCompiler();
61+
var contract = parser.Process(sourceCode).First();
62+
63+
var storage = new Dictionary<byte[], byte[]>(new ByteArrayComparer());
64+
65+
var countStuff = contract.abi.FindMethod("check");
66+
Assert.IsNotNull(countStuff);
67+
68+
var vm = new TestVM(contract, storage, countStuff);
69+
// NOTE - due to using a stack, we're pushing the second argument first (y), then the first argument (y)
70+
vm.Stack.Push(VMObject.FromObject(-3));
71+
vm.Stack.Push(VMObject.FromObject(3));
72+
var result = vm.Execute();
73+
Assert.IsTrue(result == ExecutionState.Halt);
74+
75+
Assert.IsTrue(vm.Stack.Count == 1);
76+
var val = vm.Stack.Pop().AsBool();
77+
Assert.IsTrue(val);
78+
79+
vm = new TestVM(contract, storage, countStuff);
80+
// NOTE - here we invert the order, in this case should fail due to the condition in the contract inside check()
81+
vm.Stack.Push(VMObject.FromObject(3));
82+
vm.Stack.Push(VMObject.FromObject(-3));
83+
result = vm.Execute();
84+
Assert.IsTrue(result == ExecutionState.Halt);
85+
86+
Assert.IsTrue(vm.Stack.Count == 1);
87+
val = vm.Stack.Pop().AsBool();
88+
Assert.IsFalse(val);
89+
}
690
}

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,9 @@ See examples below:<br/>
859859
```c#
860860
contract test {
861861
import Time;
862+
import Hash;
863+
import String;
864+
import Address;
862865

863866
public convertTimeToNumber(x:timestamp):number
864867
{
@@ -875,6 +878,11 @@ contract test {
875878
return String.toNumber(x);
876879
}
877880

881+
public convertAddressToString(x:address):string
882+
{
883+
return Address.toString(x);
884+
}
885+
878886
}
879887
```
880888

0 commit comments

Comments
 (0)