Skip to content

Commit

Permalink
Added string encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
yglukhov committed Jan 4, 2024
1 parent 7983333 commit fb4df63
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 5 deletions.
2 changes: 2 additions & 0 deletions tests/test_contract_dsl.nim
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ proc checkData(d: ContractInvocation | ContractDeployment, expectedData: string)
contract(TestContract):
proc getBool(): bool
proc setBool(a: bool)
proc setString(a: string)

contract(TestContractWithConstructor):
proc init(someArg1, someArg2: UInt256) {.constructor.}
Expand All @@ -42,6 +43,7 @@ suite "Contract DSL":
checkData(c.getBool(), "0x12a7b914")
checkData(c.setBool(true), "0x1e26fd330000000000000000000000000000000000000000000000000000000000000001")
checkData(c.setBool(false), "0x1e26fd330000000000000000000000000000000000000000000000000000000000000000")
checkData(c.setString("hello"), "0x7fcaf6660000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f0000000000")

test "Constructors":
let s = DummySender()
Expand Down
24 changes: 19 additions & 5 deletions tests/test_contracts.nim
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,20 @@ type
contract(EncodingTest):
proc setBool(val: bool)
proc getBool(): bool {.view.}
proc setString(a: string)
proc getString(): string
proc setData1(a: UInt256, d: seq[byte])
proc getData1(): Data1
proc getManyData1(): seq[Data1]

const EncodingTestCode = "608060405260008060006101000a81548160ff02191690831515021790555034801561002a57600080fd5b50610b508061003a6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806312a7b9141461005c5780631cb3eebe1461007a5780631e26fd33146100965780639944cc71146100b25780639fd159e6146100d0575b600080fd5b6100646100ee565b60405161007191906103cf565b60405180910390f35b610094600480360381019061008f919061048f565b610104565b005b6100b060048036038101906100ab919061051b565b610187565b005b6100ba6101a3565b6040516100c79190610624565b60405180910390f35b6100d8610259565b6040516100e59190610745565b60405180910390f35b60008060009054906101000a900460ff16905090565b604051806040016040528084815260200183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600160008201518160000155602082015181600101908161017e91906109a2565b50905050505050565b806000806101000a81548160ff02191690831515021790555050565b6101ab61039a565b6001604051806040016040529081600082015481526020016001820180546101d2906107c5565b80601f01602080910402602001604051908101604052809291908181526020018280546101fe906107c5565b801561024b5780601f106102205761010080835404028352916020019161024b565b820191906000526020600020905b81548152906001019060200180831161022e57829003601f168201915b505050505081525050905090565b6060600367ffffffffffffffff81111561027657610275610767565b5b6040519080825280602002602001820160405280156102af57816020015b61029c61039a565b8152602001906001900390816102945790505b50905060005b8151811015610396576001604051806040016040529081600082015481526020016001820180546102e5906107c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610311906107c5565b801561035e5780601f106103335761010080835404028352916020019161035e565b820191906000526020600020905b81548152906001019060200180831161034157829003601f168201915b50505050508152505082828151811061037a57610379610a74565b5b60200260200101819052508061038f90610ad2565b90506102b5565b5090565b604051806040016040528060008152602001606081525090565b60008115159050919050565b6103c9816103b4565b82525050565b60006020820190506103e460008301846103c0565b92915050565b600080fd5b600080fd5b6000819050919050565b610407816103f4565b811461041257600080fd5b50565b600081359050610424816103fe565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261044f5761044e61042a565b5b8235905067ffffffffffffffff81111561046c5761046b61042f565b5b60208301915083600182028301111561048857610487610434565b5b9250929050565b6000806000604084860312156104a8576104a76103ea565b5b60006104b686828701610415565b935050602084013567ffffffffffffffff8111156104d7576104d66103ef565b5b6104e386828701610439565b92509250509250925092565b6104f8816103b4565b811461050357600080fd5b50565b600081359050610515816104ef565b92915050565b600060208284031215610531576105306103ea565b5b600061053f84828501610506565b91505092915050565b610551816103f4565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610591578082015181840152602081019050610576565b60008484015250505050565b6000601f19601f8301169050919050565b60006105b982610557565b6105c38185610562565b93506105d3818560208601610573565b6105dc8161059d565b840191505092915050565b60006040830160008301516105ff6000860182610548565b506020830151848203602086015261061782826105ae565b9150508091505092915050565b6000602082019050818103600083015261063e81846105e7565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060408301600083015161068a6000860182610548565b50602083015184820360208601526106a282826105ae565b9150508091505092915050565b60006106bb8383610672565b905092915050565b6000602082019050919050565b60006106db82610646565b6106e58185610651565b9350836020820285016106f785610662565b8060005b85811015610733578484038952815161071485826106af565b945061071f836106c3565b925060208a019950506001810190506106fb565b50829750879550505050505092915050565b6000602082019050818103600083015261075f81846106d0565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806107dd57607f821691505b6020821081036107f0576107ef610796565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026108587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261081b565b610862868361081b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061089f61089a610895846103f4565b61087a565b6103f4565b9050919050565b6000819050919050565b6108b983610884565b6108cd6108c5826108a6565b848454610828565b825550505050565b600090565b6108e26108d5565b6108ed8184846108b0565b505050565b5b81811015610911576109066000826108da565b6001810190506108f3565b5050565b601f82111561095657610927816107f6565b6109308461080b565b8101602085101561093f578190505b61095361094b8561080b565b8301826108f2565b50505b505050565b600082821c905092915050565b60006109796000198460080261095b565b1980831691505092915050565b60006109928383610968565b9150826002028217905092915050565b6109ab82610557565b67ffffffffffffffff8111156109c4576109c3610767565b5b6109ce82546107c5565b6109d9828285610915565b600060209050601f831160018114610a0c57600084156109fa578287015190505b610a048582610986565b865550610a6c565b601f198416610a1a866107f6565b60005b82811015610a4257848901518255600182019150602085019450602081019050610a1d565b86831015610a5f5784890151610a5b601f891682610968565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610add826103f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610b0f57610b0e610aa3565b5b60018201905091905056fea2646970667358221220265a3d7b004b7ea36bfc364804ed8717fcb6adf60b5edf24d773660fb7c736df64736f6c63430008130033"
const EncodingTestCode = "0x6000805460ff1916815560a0604052608090815260019061002090826100d2565b5034801561002d57600080fd5b50610191565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061005d57607f821691505b60208210810361007d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156100cd57600081815260208120601f850160051c810160208610156100aa5750805b601f850160051c820191505b818110156100c9578281556001016100b6565b5050505b505050565b81516001600160401b038111156100eb576100eb610033565b6100ff816100f98454610049565b84610083565b602080601f831160018114610134576000841561011c5750858301515b600019600386901b1c1916600185901b1785556100c9565b600085815260208120601f198616915b8281101561016357888601518255948401946001909101908401610144565b50858210156101815787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610a27806101a06000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80637fcaf6661161005b5780637fcaf666146100f157806389ea642f146101045780639944cc71146101195780639fd159e61461012e57600080fd5b806312a7b914146100825780631cb3eebe1461009d5780631e26fd33146100b2575b600080fd5b60005460ff1660405190151581526020015b60405180910390f35b6100b06100ab36600461047e565b610143565b005b6100b06100c03660046104ca565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6100b06100ff3660046104f3565b6101ad565b61010c6101bf565b6040516100949190610599565b610121610251565b60405161009491906105d3565b610136610310565b60405161009491906105e6565b604051806040016040528084815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152508051600290815560208201516003906101a5908261072e565b505050505050565b60016101ba828483610848565b505050565b6060600180546101ce90610695565b80601f01602080910402602001604051908101604052809291908181526020018280546101fa90610695565b80156102475780601f1061021c57610100808354040283529160200191610247565b820191906000526020600020905b81548152906001019060200180831161022a57829003601f168201915b5050505050905090565b604080518082019091526000815260606020820152604080518082019091526002805482526003805460208401919061028990610695565b80601f01602080910402602001604051908101604052809291908181526020018280546102b590610695565b80156103025780601f106102d757610100808354040283529160200191610302565b820191906000526020600020905b8154815290600101906020018083116102e557829003601f168201915b505050505081525050905090565b60408051600380825260808201909252606091816020015b60408051808201909152600081526060602082015281526020019060019003908161032857905050905060005b815181101561043157604080518082019091526002805482526003805460208401919061038190610695565b80601f01602080910402602001604051908101604052809291908181526020018280546103ad90610695565b80156103fa5780601f106103cf576101008083540402835291602001916103fa565b820191906000526020600020905b8154815290600101906020018083116103dd57829003601f168201915b50505050508152505082828151811061041557610415610963565b60200260200101819052508061042a90610992565b9050610355565b5090565b60008083601f84011261044757600080fd5b50813567ffffffffffffffff81111561045f57600080fd5b60208301915083602082850101111561047757600080fd5b9250929050565b60008060006040848603121561049357600080fd5b83359250602084013567ffffffffffffffff8111156104b157600080fd5b6104bd86828701610435565b9497909650939450505050565b6000602082840312156104dc57600080fd5b813580151581146104ec57600080fd5b9392505050565b6000806020838503121561050657600080fd5b823567ffffffffffffffff81111561051d57600080fd5b61052985828601610435565b90969095509350505050565b6000815180845260005b8181101561055b5760208185018101518683018201520161053f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006104ec6020830184610535565b8051825260006020820151604060208501526105cb6040850182610535565b949350505050565b6020815260006104ec60208301846105ac565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610659577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526106478583516105ac565b9450928501929085019060010161060d565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806106a957607f821691505b6020821081036106e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156101ba57600081815260208120601f850160051c8101602086101561070f5750805b601f850160051c820191505b818110156101a55782815560010161071b565b815167ffffffffffffffff81111561074857610748610666565b61075c816107568454610695565b846106e8565b602080601f8311600181146107af57600084156107795750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556101a5565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156107fc578886015182559484019460019091019084016107dd565b508582101561083857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83111561086057610860610666565b6108748361086e8354610695565b836106e8565b6000601f8411600181146108c657600085156108905750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561095c565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561091557868501358255602094850194600190920191016108f5565b5086821015610950577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212205dbf820dba2d3dea0502a6521ca26db2e50cf5819a87cc8518ad67dbd8091e3664736f6c63430008130033"

#[ Contract EncodingTest
pragma solidity ^0.8.0;
contract EncodingTest {
bool boolVal = false;
string stringVal = "";
struct Data1 {
uint a;
Expand All @@ -49,6 +52,14 @@ contract EncodingTest {
return boolVal;
}
function setString(string a) {
stringVal = a;
}
function getString() public view returns (string) {
return stringVal;
}
function setData1(uint a, bytes calldata data) public {
data1 = Data1(a, data);
}
Expand Down Expand Up @@ -155,13 +166,16 @@ suite "Contracts":

var b = await ns.getBool().call()
assert(b == false)

let r = await ns.setBool(true).send()
echo "setBool: ", r

await ns.setBool(true).exec()
b = await ns.getBool().call()
assert(b == true)

var s = await ns.getString().call()
assert(s == "")
await ns.setString("hello").exec()
s = await ns.getString().call()
assert(s == "hello")

let data1data = @[1.byte, 2, 3, 4, 5]
discard await ns.setData1(123.u256, data1data).send()

Expand Down
12 changes: 12 additions & 0 deletions web3/encoding.nim
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ func encode*(x: DynamicBytes): seq[byte] {.inline.} =
func encode*(x: seq[byte]): seq[byte] {.inline.} =
encodeDynamic(x)

func encode*(x: string): seq[byte] {.inline.} =
encodeDynamic(x.toOpenArrayByte(0, x.high))

func decode*(input: openarray[byte], baseOffset, offset: int, to: var seq[byte]): int =
var dataOffsetBig, dataLenBig: UInt256
result = decode(input, baseOffset, offset, dataOffsetBig)
Expand All @@ -76,6 +79,15 @@ func decode*(input: openarray[byte], baseOffset, offset: int, to: var seq[byte])
let actualDataOffset = baseOffset + dataOffset + 32
to = input[actualDataOffset ..< actualDataOffset + dataLen]

func decode*(input: openarray[byte], baseOffset, offset: int, to: var string): int =
var dataOffsetBig, dataLenBig: UInt256
result = decode(input, baseOffset, offset, dataOffsetBig)
let dataOffset = dataOffsetBig.truncate(int)
discard decode(input, baseOffset, dataOffset, dataLenBig)
let dataLen = dataLenBig.truncate(int)
let actualDataOffset = baseOffset + dataOffset + 32
to = string.fromBytes(input.toOpenArray(actualDataOffset, actualDataOffset + dataLen - 1))

func decode*(input: openarray[byte], baseOffset, offset: int, to: var DynamicBytes): int {.inline.} =
var s: seq[byte]
result = decode(input, baseOffset, offset, s)
Expand Down

0 comments on commit fb4df63

Please sign in to comment.