From a5a141ee0b9489ec2fc13b871bf2c4da1934353b Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 12 Sep 2023 17:24:39 +0300 Subject: [PATCH 1/6] started to use sc intents factory in the sc class --- src/smartcontracts/codeMetadata.ts | 19 +++++- src/smartcontracts/interface.ts | 6 +- src/smartcontracts/smartContract.ts | 66 ++++++++++++++----- .../smartContractTransactionIntentsFactory.ts | 13 +++- 4 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/smartcontracts/codeMetadata.ts b/src/smartcontracts/codeMetadata.ts index 46e74a13..1025f4a0 100644 --- a/src/smartcontracts/codeMetadata.ts +++ b/src/smartcontracts/codeMetadata.ts @@ -6,6 +6,7 @@ export class CodeMetadata { private readable: boolean; private payable: boolean; private payableBySc: boolean; + private static readonly lengthOfCodeMetadata = 2; /** * Creates a metadata object. By default, set the `upgradeable` attribute, and uset all others. @@ -22,6 +23,22 @@ export class CodeMetadata { this.payableBySc = payableBySc } + static fromBytes(bytes: Uint8Array): CodeMetadata { + if (bytes.length !== this.lengthOfCodeMetadata) { + return new CodeMetadata(); + } + + const byteZero = bytes[0]; + const byteOne = bytes[1]; + + const upgradeable = (byteZero & ByteZero.Upgradeable) !== 0; + const readable = (byteZero & ByteZero.Readable) !== 0; + const payable = (byteOne & ByteOne.Payable) !== 0; + const payableBySc = (byteOne & ByteOne.PayableBySc) !== 0; + + return new CodeMetadata(upgradeable, readable, payable, payableBySc); + } + /** * Adjust the metadata (the `upgradeable` attribute), when preparing the deployment transaction. */ @@ -49,7 +66,7 @@ export class CodeMetadata { togglePayableBySc(value: boolean) { this.payableBySc = value; } - + /** * Converts the metadata to the protocol-friendly representation. */ diff --git a/src/smartcontracts/interface.ts b/src/smartcontracts/interface.ts index 2aa1815a..6771d057 100644 --- a/src/smartcontracts/interface.ts +++ b/src/smartcontracts/interface.ts @@ -31,7 +31,7 @@ export interface ISmartContract { export interface DeployArguments { code: ICode; codeMetadata?: ICodeMetadata; - initArguments?: TypedValue[]; + initArguments?: any[]; value?: ITransactionValue; gasLimit: IGasLimit; gasPrice?: IGasPrice; @@ -42,7 +42,7 @@ export interface DeployArguments { export interface UpgradeArguments { code: ICode; codeMetadata?: ICodeMetadata; - initArguments?: TypedValue[]; + initArguments?: any[]; value?: ITransactionValue; gasLimit: IGasLimit; gasPrice?: IGasPrice; @@ -52,7 +52,7 @@ export interface UpgradeArguments { export interface CallArguments { func: IContractFunction; - args?: TypedValue[]; + args?: any[]; value?: ITransactionValue; gasLimit: IGasLimit; receiver?: IAddress; diff --git a/src/smartcontracts/smartContract.ts b/src/smartcontracts/smartContract.ts index 0ab5e8e0..1b3f11dc 100644 --- a/src/smartcontracts/smartContract.ts +++ b/src/smartcontracts/smartContract.ts @@ -9,14 +9,19 @@ import { bigIntToBuffer } from "./codec/utils"; import { CodeMetadata } from "./codeMetadata"; import { ContractFunction } from "./function"; import { Interaction } from "./interaction"; -import { CallArguments, DeployArguments, ISmartContract, QueryArguments, UpgradeArguments } from "./interface"; +import { CallArguments, DeployArguments, ICodeMetadata, ISmartContract, QueryArguments, UpgradeArguments } from "./interface"; import { NativeSerializer } from "./nativeSerializer"; import { Query } from "./query"; -import { ArwenVirtualMachine, ContractCallPayloadBuilder, ContractDeployPayloadBuilder, ContractUpgradePayloadBuilder } from "./transactionPayloadBuilders"; +import { ArwenVirtualMachine, ContractCallPayloadBuilder, ContractUpgradePayloadBuilder } from "./transactionPayloadBuilders"; import { EndpointDefinition, TypedValue } from "./typesystem"; +import { SmartContractTransactionIntentsFactory } from "../transactionIntentsFactories/smartContractTransactionIntentsFactory"; +import { TransactionIntentsFactoryConfig } from "../transactionIntentsFactories/transactionIntentsFactoryConfig"; +import { TransactionPayload } from "../transactionPayload"; const createKeccakHash = require("keccak"); interface IAbi { + constructorDefinition: EndpointDefinition; + getEndpoints(): EndpointDefinition[]; getEndpoint(name: string | ContractFunction): EndpointDefinition; } @@ -110,27 +115,58 @@ export class SmartContract implements ISmartContract { deploy({ deployer, code, codeMetadata, initArguments, value, gasLimit, gasPrice, chainID }: DeployArguments): Transaction { Compatibility.guardAddressIsSetAndNonZero(deployer, "'deployer' of SmartContract.deploy()", "pass the actual address to deploy()"); - codeMetadata = codeMetadata || new CodeMetadata(); - initArguments = initArguments || []; - value = value || 0; + const config = new TransactionIntentsFactoryConfig(chainID.valueOf()); + const scIntentFactory = new SmartContractTransactionIntentsFactory({ + config: config, + abi: this.abi + }); - let payload = new ContractDeployPayloadBuilder() - .setCode(code) - .setCodeMetadata(codeMetadata) - .setInitArgs(initArguments) - .build(); + const bytecode = Uint8Array.from(Buffer.from(code.toString(), 'hex')); + const metadataAsJson = this.getMetadataPropertiesAsObject(codeMetadata); - let transaction = new Transaction({ - receiver: Address.Zero(), + const intent = scIntentFactory.createTransactionIntentForDeploy({ sender: deployer, + bytecode: bytecode, + gasLimit: gasLimit.valueOf(), + args: initArguments, + isUpgradeable: metadataAsJson.upgradeable, + isReadable: metadataAsJson.readable, + isPayable: metadataAsJson.payable, + isPayableBySmartContract: metadataAsJson.payableBySc + }); + + return new Transaction({ + receiver: Address.fromBech32(intent.receiver), + sender: Address.fromBech32(intent.sender), value: value, - gasLimit: gasLimit, + gasLimit: new BigNumber(intent.gasLimit).toNumber(), gasPrice: gasPrice, - data: payload, + data: new TransactionPayload(Buffer.from(intent.data!)), chainID: chainID }); + } - return transaction; + private getMetadataPropertiesAsObject(codeMetadata?: ICodeMetadata): { + upgradeable: boolean, + readable: boolean, + payable: boolean, + payableBySc: boolean + } { + let metadata: CodeMetadata; + if (codeMetadata) { + metadata = CodeMetadata.fromBytes(Buffer.from(codeMetadata.toString(), "hex")); + } + else { + metadata = new CodeMetadata(); + } + const metadataAsJson = metadata.toJSON() as { + upgradeable: boolean, + readable: boolean, + payable: boolean, + payableBySc: boolean + }; + + return metadataAsJson; } /** diff --git a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts index 21b5a83c..4a3475ca 100644 --- a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts +++ b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts @@ -1,7 +1,7 @@ import { BigNumber } from "bignumber.js"; import { IAddress } from "../interface"; import { TransactionIntent } from "../transactionIntent"; -import { AbiRegistry, ArgSerializer, CodeMetadata, EndpointDefinition } from "../smartcontracts"; +import { AbiRegistry, ArgSerializer, CodeMetadata, ContractFunction, EndpointDefinition } from "../smartcontracts"; import { byteArrayToHex } from "../utils.codec"; import { CONTRACT_DEPLOY_ADDRESS, VM_TYPE_WASM_VM } from "../constants"; import { NativeSerializer } from "../smartcontracts/nativeSerializer"; @@ -15,16 +15,23 @@ interface Config { gasLimitPerByte: BigNumber.Value; } +interface Abi { + constructorDefinition: EndpointDefinition; + + getEndpoint(name: string | ContractFunction): EndpointDefinition; +} + + export class SmartContractTransactionIntentsFactory { private readonly config: Config; - private readonly abiRegistry?: AbiRegistry; + private readonly abiRegistry?: Abi; constructor({ config, abi }: { config: Config; - abi?: AbiRegistry; + abi?: Abi; }) { this.config = config; this.abiRegistry = abi; From bffae4a907c4bb1e6ef2845e0097304d941fc60d Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 13 Sep 2023 10:59:28 +0300 Subject: [PATCH 2/6] fix transaction intent for deploy --- src/smartcontracts/smartContract.spec.ts | 2 +- .../smartContractTransactionIntentsFactory.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/smartcontracts/smartContract.spec.ts b/src/smartcontracts/smartContract.spec.ts index 51233d05..25ef5f02 100644 --- a/src/smartcontracts/smartContract.spec.ts +++ b/src/smartcontracts/smartContract.spec.ts @@ -49,7 +49,7 @@ describe("test contract", () => { deployTransaction.setNonce(alice.account.nonce); assert.equal(deployTransaction.getData().valueOf().toString(), "01020304@0500@0100"); - assert.equal(deployTransaction.getGasLimit().valueOf(), 1000000); + assert.equal(deployTransaction.getGasLimit().valueOf(), 1077000); assert.equal(deployTransaction.getNonce().valueOf(), 42); // Compute & set the contract address diff --git a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts index 4a3475ca..1aeda4df 100644 --- a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts +++ b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts @@ -47,10 +47,10 @@ export class SmartContractTransactionIntentsFactory { isPayable?: boolean, isPayableBySmartContract?: boolean }): TransactionIntent { - const isUpgradeable = options.isUpgradeable || true; - const isReadable = options.isReadable || true; - const isPayable = options.isPayable || false; - const isPayableBySmartContract = options.isPayableBySmartContract || true; + const isUpgradeable = options.isUpgradeable ?? true; + const isReadable = options.isReadable ?? true; + const isPayable = options.isPayable ?? false; + const isPayableBySmartContract = options.isPayableBySmartContract ?? true; const args = options.args || []; From 19a643edad7e0bc8d80814c201480fccc4938224 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 13 Sep 2023 11:45:11 +0300 Subject: [PATCH 3/6] contract upgrade --- src/smartcontracts/smartContract.spec.ts | 39 +++++++++++++++++++ src/smartcontracts/smartContract.ts | 37 +++++++++++------- .../smartContractTransactionIntentsFactory.ts | 8 ++-- 3 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/smartcontracts/smartContract.spec.ts b/src/smartcontracts/smartContract.spec.ts index 25ef5f02..88a73643 100644 --- a/src/smartcontracts/smartContract.spec.ts +++ b/src/smartcontracts/smartContract.spec.ts @@ -125,4 +125,43 @@ describe("test contract", () => { assert.isTrue((await provider.getTransactionStatus(hashOne)).isExecuted()); assert.isTrue((await provider.getTransactionStatus(hashTwo)).isExecuted()); }); + + it.only("should upgrade", async () => { + setupUnitTestWatcherTimeouts(); + let watcher = new TransactionWatcher(provider); + + let contract = new SmartContract(); + contract.setAddress(Address.fromBech32("erd1qqqqqqqqqqqqqpgq3ytm9m8dpeud35v3us20vsafp77smqghd8ss4jtm0q")) + + let deployTransaction = contract.upgrade({ + code: Code.fromBuffer(Buffer.from([1, 2, 3, 4])), + gasLimit: 1000000, + chainID: chainID, + caller: alice.address + }); + + provider.mockUpdateAccount(alice.address, account => { + account.nonce = 42; + }); + + await alice.sync(provider); + deployTransaction.setNonce(alice.account.nonce); + + assert.equal(deployTransaction.getData().valueOf().toString(), "upgradeContract@01020304@0100"); + assert.equal(deployTransaction.getGasLimit().valueOf(), 1093500); + assert.equal(deployTransaction.getNonce().valueOf(), 42); + + // Sign the transaction + alice.signer.sign(deployTransaction); + + // Now let's broadcast the deploy transaction, and wait for its execution. + let hash = await provider.sendTransaction(deployTransaction); + + await Promise.all([ + provider.mockTransactionTimeline(deployTransaction, [new Wait(40), new TransactionStatus("pending"), new Wait(40), new TransactionStatus("executed"), new MarkCompleted()]), + watcher.awaitCompleted(deployTransaction) + ]); + + assert.isTrue((await provider.getTransactionStatus(hash)).isExecuted()); + }); }); diff --git a/src/smartcontracts/smartContract.ts b/src/smartcontracts/smartContract.ts index 1b3f11dc..784628df 100644 --- a/src/smartcontracts/smartContract.ts +++ b/src/smartcontracts/smartContract.ts @@ -177,27 +177,36 @@ export class SmartContract implements ISmartContract { this.ensureHasAddress(); - codeMetadata = codeMetadata || new CodeMetadata(); - initArguments = initArguments || []; - value = value || 0; + const config = new TransactionIntentsFactoryConfig(chainID.valueOf()); + const scIntentFactory = new SmartContractTransactionIntentsFactory({ + config: config, + abi: this.abi + }); - let payload = new ContractUpgradePayloadBuilder() - .setCode(code) - .setCodeMetadata(codeMetadata) - .setInitArgs(initArguments) - .build(); + const bytecode = Uint8Array.from(Buffer.from(code.toString(), 'hex')); + const metadataAsJson = this.getMetadataPropertiesAsObject(codeMetadata); - let transaction = new Transaction({ + const intent = scIntentFactory.createTransactionIntentForUpgrade({ sender: caller, - receiver: this.getAddress(), + contract: this.getAddress(), + bytecode: bytecode, + gasLimit: gasLimit.valueOf(), + args: initArguments, + isUpgradeable: metadataAsJson.upgradeable, + isReadable: metadataAsJson.readable, + isPayable: metadataAsJson.payable, + isPayableBySmartContract: metadataAsJson.payableBySc + }) + + return new Transaction({ + receiver: Address.fromBech32(intent.receiver), + sender: Address.fromBech32(intent.sender), value: value, - gasLimit: gasLimit, + gasLimit: new BigNumber(intent.gasLimit).toNumber(), gasPrice: gasPrice, - data: payload, + data: new TransactionPayload(Buffer.from(intent.data!)), chainID: chainID }); - - return transaction; } /** diff --git a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts index 1aeda4df..15ea40c1 100644 --- a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts +++ b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts @@ -108,10 +108,10 @@ export class SmartContractTransactionIntentsFactory { isPayableBySmartContract?: boolean } ): TransactionIntent { - const isUpgradeable = options.isUpgradeable || true; - const isReadable = options.isReadable || true; - const isPayable = options.isPayable || false; - const isPayableBySmartContract = options.isPayableBySmartContract || true; + const isUpgradeable = options.isUpgradeable ?? true; + const isReadable = options.isReadable ?? true; + const isPayable = options.isPayable ?? false; + const isPayableBySmartContract = options.isPayableBySmartContract ?? true; const args = options.args || []; const metadata = new CodeMetadata(isUpgradeable, isReadable, isPayable, isPayableBySmartContract); From 48ee42807b3378fbb83400d9366716711cc5f48f Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 13 Sep 2023 13:56:07 +0300 Subject: [PATCH 4/6] integrate sc intents factory --- src/smartcontracts/interaction.spec.ts | 6 ++-- src/smartcontracts/smartContract.spec.ts | 6 ++-- src/smartcontracts/smartContract.ts | 31 ++++++++++++------- ...tContractTransactionIntentsFactory.spec.ts | 4 +-- .../smartContractTransactionIntentsFactory.ts | 6 ++-- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/smartcontracts/interaction.spec.ts b/src/smartcontracts/interaction.spec.ts index 2fb119d1..501b11d9 100644 --- a/src/smartcontracts/interaction.spec.ts +++ b/src/smartcontracts/interaction.spec.ts @@ -41,7 +41,7 @@ describe("test smart contract interactor", function () { assert.deepEqual(transaction.getReceiver(), dummyAddress); assert.equal(transaction.getValue().toString(), "1000000000000000000"); assert.equal(transaction.getNonce(), 7); - assert.equal(transaction.getGasLimit().valueOf(), 20000000); + assert.equal(transaction.getGasLimit().valueOf(), 20057500); }); it("should set transfers (payments) on contract calls (transfer and execute)", async function () { @@ -188,7 +188,7 @@ describe("test smart contract interactor", function () { assert.equal(transaction.getData().toString(), "getUltimateAnswer"); assert.equal( transaction.getHash().toString(), - "60d0956a8902c1179dce92d91bd9670e31b9a9cd07c1d620edb7754a315b4818" + "3ff6309bfe87ecc4ab541db649d57187f3a012291570552ac003866f77212c19" ); transaction = interaction.withNonce(1).buildTransaction(); @@ -198,7 +198,7 @@ describe("test smart contract interactor", function () { assert.equal(transaction.getNonce().valueOf(), 1); assert.equal( transaction.getHash().toString(), - "acd207c38f6c3341b18d8ef331fa07ba49615fa12d7610aad5d8495293049f24" + "85a3044ba2e07317a7e5dd866a5e57f900f7e01d0802c8cd634f4a521261dadf" ); // Execute, and wait for execution diff --git a/src/smartcontracts/smartContract.spec.ts b/src/smartcontracts/smartContract.spec.ts index 88a73643..af74abb2 100644 --- a/src/smartcontracts/smartContract.spec.ts +++ b/src/smartcontracts/smartContract.spec.ts @@ -103,10 +103,10 @@ describe("test contract", () => { assert.equal(callTransactionOne.getNonce().valueOf(), 42); assert.equal(callTransactionOne.getData().valueOf().toString(), "helloEarth@05@0123"); - assert.equal(callTransactionOne.getGasLimit().valueOf(), 150000); + assert.equal(callTransactionOne.getGasLimit().valueOf(), 227000); assert.equal(callTransactionTwo.getNonce().valueOf(), 43); assert.equal(callTransactionTwo.getData().valueOf().toString(), "helloMars@05@0123"); - assert.equal(callTransactionTwo.getGasLimit().valueOf(), 1500000); + assert.equal(callTransactionTwo.getGasLimit().valueOf(), 1575500); // Sign transactions, broadcast them alice.signer.sign(callTransactionOne); @@ -126,7 +126,7 @@ describe("test contract", () => { assert.isTrue((await provider.getTransactionStatus(hashTwo)).isExecuted()); }); - it.only("should upgrade", async () => { + it("should upgrade", async () => { setupUnitTestWatcherTimeouts(); let watcher = new TransactionWatcher(provider); diff --git a/src/smartcontracts/smartContract.ts b/src/smartcontracts/smartContract.ts index 784628df..011187fd 100644 --- a/src/smartcontracts/smartContract.ts +++ b/src/smartcontracts/smartContract.ts @@ -199,8 +199,8 @@ export class SmartContract implements ISmartContract { }) return new Transaction({ - receiver: Address.fromBech32(intent.receiver), sender: Address.fromBech32(intent.sender), + receiver: Address.fromBech32(intent.receiver), value: value, gasLimit: new BigNumber(intent.gasLimit).toNumber(), gasPrice: gasPrice, @@ -217,25 +217,32 @@ export class SmartContract implements ISmartContract { this.ensureHasAddress(); + const config = new TransactionIntentsFactoryConfig(chainID.valueOf()); + const scIntentFactory = new SmartContractTransactionIntentsFactory({ + config: config, + abi: this.abi + }); + args = args || []; value = value || 0; - let payload = new ContractCallPayloadBuilder() - .setFunction(func) - .setArgs(args) - .build(); + const intent = scIntentFactory.createTransactionIntentForExecute({ + sender: caller, + contractAddress: receiver ? receiver : this.getAddress(), + functionName: func.toString(), + gasLimit: gasLimit.valueOf(), + args: args + }) - let transaction = new Transaction({ + return new Transaction({ sender: caller, - receiver: receiver ? receiver : this.getAddress(), + receiver: Address.fromBech32(intent.receiver), value: value, - gasLimit: gasLimit, + gasLimit: new BigNumber(intent.gasLimit).toNumber(), gasPrice: gasPrice, - data: payload, - chainID: chainID, + data: new TransactionPayload(Buffer.from(intent.data!)), + chainID: chainID }); - - return transaction; } createQuery({ func, args, value, caller }: QueryArguments): Query { diff --git a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.spec.ts b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.spec.ts index 9fdfb020..61a5436f 100644 --- a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.spec.ts +++ b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.spec.ts @@ -84,14 +84,14 @@ describe("test smart contract intents factory", function () { const deployIntent = factory.createTransactionIntentForExecute({ sender: sender, contractAddress: contract, - func: func, + functionName: func, gasLimit: gasLimit, args: args }); const abiDeployIntent = abiAwareFactory.createTransactionIntentForExecute({ sender: sender, contractAddress: contract, - func: func, + functionName: func, gasLimit: gasLimit, args: args }); diff --git a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts index 15ea40c1..85899cfd 100644 --- a/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts +++ b/src/transactionIntentsFactories/smartContractTransactionIntentsFactory.ts @@ -76,15 +76,15 @@ export class SmartContractTransactionIntentsFactory { createTransactionIntentForExecute(options: { sender: IAddress, contractAddress: IAddress, - func: string, + functionName: string, gasLimit: BigNumber.Value, args?: any[] } ): TransactionIntent { const args = options.args || []; - let parts: string[] = [options.func]; + let parts: string[] = [options.functionName]; - const preparedArgs = this.argsToDataParts(args, this.abiRegistry?.constructorDefinition) + const preparedArgs = this.argsToDataParts(args, this.abiRegistry?.getEndpoint(options.functionName)); parts = parts.concat(preparedArgs); return new TransactionIntentBuilder({ From bf0a6537f3f75e1fa8ddfedf43a724c2bdd2f9c8 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 13 Sep 2023 14:07:44 +0300 Subject: [PATCH 5/6] rename variable --- src/smartcontracts/codeMetadata.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/smartcontracts/codeMetadata.ts b/src/smartcontracts/codeMetadata.ts index 1025f4a0..6b493b5b 100644 --- a/src/smartcontracts/codeMetadata.ts +++ b/src/smartcontracts/codeMetadata.ts @@ -6,7 +6,7 @@ export class CodeMetadata { private readable: boolean; private payable: boolean; private payableBySc: boolean; - private static readonly lengthOfCodeMetadata = 2; + private static readonly codeMetadataLength = 2; /** * Creates a metadata object. By default, set the `upgradeable` attribute, and uset all others. @@ -24,7 +24,7 @@ export class CodeMetadata { } static fromBytes(bytes: Uint8Array): CodeMetadata { - if (bytes.length !== this.lengthOfCodeMetadata) { + if (bytes.length !== this.codeMetadataLength) { return new CodeMetadata(); } From 74b047887a1d806533f602d5d832f34a25d552bf Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 20 Sep 2023 16:14:41 +0300 Subject: [PATCH 6/6] fixes after review --- src/smartcontracts/codeMetadata.spec.ts | 17 +++++++++++++++++ src/smartcontracts/interaction.spec.ts | 6 +++--- src/smartcontracts/smartContract.spec.ts | 8 ++++---- src/smartcontracts/smartContract.ts | 2 +- 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 src/smartcontracts/codeMetadata.spec.ts diff --git a/src/smartcontracts/codeMetadata.spec.ts b/src/smartcontracts/codeMetadata.spec.ts new file mode 100644 index 00000000..753be461 --- /dev/null +++ b/src/smartcontracts/codeMetadata.spec.ts @@ -0,0 +1,17 @@ +import { assert } from "chai"; +import { CodeMetadata } from "./codeMetadata"; + +describe("test code metadata", function () { + it("should test code metadata from bytes", () => { + const bytes = new Uint8Array([1, 0]); + const codeMetadata = CodeMetadata.fromBytes(bytes); + + assert.equal(codeMetadata.toString(), "0100"); + assert.deepEqual(codeMetadata.toJSON(), { + upgradeable: true, + readable: false, + payable: false, + payableBySc: false + }); + }); +}); diff --git a/src/smartcontracts/interaction.spec.ts b/src/smartcontracts/interaction.spec.ts index 501b11d9..2fb119d1 100644 --- a/src/smartcontracts/interaction.spec.ts +++ b/src/smartcontracts/interaction.spec.ts @@ -41,7 +41,7 @@ describe("test smart contract interactor", function () { assert.deepEqual(transaction.getReceiver(), dummyAddress); assert.equal(transaction.getValue().toString(), "1000000000000000000"); assert.equal(transaction.getNonce(), 7); - assert.equal(transaction.getGasLimit().valueOf(), 20057500); + assert.equal(transaction.getGasLimit().valueOf(), 20000000); }); it("should set transfers (payments) on contract calls (transfer and execute)", async function () { @@ -188,7 +188,7 @@ describe("test smart contract interactor", function () { assert.equal(transaction.getData().toString(), "getUltimateAnswer"); assert.equal( transaction.getHash().toString(), - "3ff6309bfe87ecc4ab541db649d57187f3a012291570552ac003866f77212c19" + "60d0956a8902c1179dce92d91bd9670e31b9a9cd07c1d620edb7754a315b4818" ); transaction = interaction.withNonce(1).buildTransaction(); @@ -198,7 +198,7 @@ describe("test smart contract interactor", function () { assert.equal(transaction.getNonce().valueOf(), 1); assert.equal( transaction.getHash().toString(), - "85a3044ba2e07317a7e5dd866a5e57f900f7e01d0802c8cd634f4a521261dadf" + "acd207c38f6c3341b18d8ef331fa07ba49615fa12d7610aad5d8495293049f24" ); // Execute, and wait for execution diff --git a/src/smartcontracts/smartContract.spec.ts b/src/smartcontracts/smartContract.spec.ts index af74abb2..337f7ac1 100644 --- a/src/smartcontracts/smartContract.spec.ts +++ b/src/smartcontracts/smartContract.spec.ts @@ -49,7 +49,7 @@ describe("test contract", () => { deployTransaction.setNonce(alice.account.nonce); assert.equal(deployTransaction.getData().valueOf().toString(), "01020304@0500@0100"); - assert.equal(deployTransaction.getGasLimit().valueOf(), 1077000); + assert.equal(deployTransaction.getGasLimit().valueOf(), 1000000); assert.equal(deployTransaction.getNonce().valueOf(), 42); // Compute & set the contract address @@ -103,10 +103,10 @@ describe("test contract", () => { assert.equal(callTransactionOne.getNonce().valueOf(), 42); assert.equal(callTransactionOne.getData().valueOf().toString(), "helloEarth@05@0123"); - assert.equal(callTransactionOne.getGasLimit().valueOf(), 227000); + assert.equal(callTransactionOne.getGasLimit().valueOf(), 150000); assert.equal(callTransactionTwo.getNonce().valueOf(), 43); assert.equal(callTransactionTwo.getData().valueOf().toString(), "helloMars@05@0123"); - assert.equal(callTransactionTwo.getGasLimit().valueOf(), 1575500); + assert.equal(callTransactionTwo.getGasLimit().valueOf(), 1500000); // Sign transactions, broadcast them alice.signer.sign(callTransactionOne); @@ -148,7 +148,7 @@ describe("test contract", () => { deployTransaction.setNonce(alice.account.nonce); assert.equal(deployTransaction.getData().valueOf().toString(), "upgradeContract@01020304@0100"); - assert.equal(deployTransaction.getGasLimit().valueOf(), 1093500); + assert.equal(deployTransaction.getGasLimit().valueOf(), 1000000); assert.equal(deployTransaction.getNonce().valueOf(), 42); // Sign the transaction diff --git a/src/smartcontracts/smartContract.ts b/src/smartcontracts/smartContract.ts index 011187fd..0b6d7124 100644 --- a/src/smartcontracts/smartContract.ts +++ b/src/smartcontracts/smartContract.ts @@ -121,7 +121,7 @@ export class SmartContract implements ISmartContract { abi: this.abi }); - const bytecode = Uint8Array.from(Buffer.from(code.toString(), 'hex')); + const bytecode = Buffer.from(code.toString(), 'hex'); const metadataAsJson = this.getMetadataPropertiesAsObject(codeMetadata); const intent = scIntentFactory.createTransactionIntentForDeploy({