diff --git a/CHANGELOG.md b/CHANGELOG.md
index ac65564..db0a996 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## 1.1.6 (2023-05-15)
+
+### Improvements
+* Updated to newer compiler version 0.62.0
+* Added `CollectionBase` and `NftBase` implementations to inherit from
+
## 1.1.4 (2022-08-17)
### Improvements
diff --git a/README.md b/README.md
index 8bb3fa7..a896a40 100644
--- a/README.md
+++ b/README.md
@@ -1,153 +1,18 @@
-# everscale-tip
+# TIP4 NFT
+# Prerequisites
-# What is needed for development?
+- Install [npm](https://www.npmjs.com/)
+- Install [Locklift](https://github.com/broxus/locklift.git)
-- Install [TON Solidity Compiler](https://github.com/tonlabs/TON-Solidity-Compiler.git)
-- Install [TVM linker](https://github.com/tonlabs/TVM-linker/releases/tag/0.14.2)
-- Install [nmp](https://www.npmjs.com/)
# Initialize project
1. Create empty folder and move to it
-1. Init npm project. ```npm init -y```
-1. Install itgold library for development NFT. ```npm i @itgold/everscale-tip```
+2. Init locklift project. ```locklift init```
+3. Install library for NFT. ```npm i tip4```
+4. Add NFT contracts to `externalContracts` and `precompiled` sections of your `locklift.config.ts`
-# How to run tests
+# Run tests
```npm run test```
-# How to use library
-
-1. Create ```Nft.sol``` file and fill it.
-
-```solidity
-pragma ton-solidity = 0.58.1;
-
-pragma AbiHeader expire;
-pragma AbiHeader time;
-pragma AbiHeader pubkey;
-
-
-import '@itgold/everscale-tip/contracts/TIP4_1/TIP4_1Nft.sol';
-
-contract Nft is TIP4_1Nft {
-
- constructor(
- address owner,
- address sendGasTo,
- uint128 remainOnNft
- ) TIP4_1Nft(
- owner,
- sendGasTo,
- remainOnNft
- ) public {}
-
-}
-```
-
-2. Create ```Collection.sol``` file and fill it.
-
-```solidity
-pragma ton-solidity = 0.58.1;
-
-pragma AbiHeader expire;
-pragma AbiHeader time;
-pragma AbiHeader pubkey;
-
-
-import '@itgold/everscale-tip/contracts/TIP4_1/TIP4_1Collection.sol';
-import '@itgold/everscale-tip/contracts/access/OwnableExternal.sol';
-import './Nft.sol';
-
-contract Collection is TIP4_1Collection, OwnableExternal {
-
- /**
- * Errors
- **/
- uint8 constant sender_is_not_owner = 100;
- uint8 constant value_is_less_than_required = 101;
-
- /// _remainOnNft - the number of crystals that will remain after the entire mint
- /// process is completed on the Nft contract
- uint128 _remainOnNft = 0.3 ton;
-
- constructor(
- TvmCell codeNft,
- uint256 ownerPubkey
- ) OwnableExternal(
- ownerPubkey
- ) TIP4_1Collection (
- codeNft
- ) public {
- tvm.accept();
- }
-
- function mintNft() external virtual {
- require(msg.value > _remainOnNft + 0.1 ton, value_is_less_than_required);
- tvm.rawReserve(0, 4);
-
- uint256 id = uint256(_totalSupply);
- _totalSupply++;
-
- TvmCell codeNft = _buildNftCode(address(this));
- TvmCell stateNft = _buildNftState(codeNft, id);
- address nftAddr = new Nft{
- stateInit: stateNft,
- value: 0,
- flag: 128
- }(
- msg.sender,
- msg.sender,
- _remainOnNft
- );
-
- emit NftCreated(
- id,
- nftAddr,
- msg.sender,
- msg.sender,
- msg.sender
- );
-
- }
-
- function setRemainOnNft(uint128 remainOnNft) external virtual {
- require(TIP4_1Collection._isOwner(), sender_is_not_owner);
- _remainOnNft = remainOnNft;
- }
-
- function _isOwner() internal override onlyOwner returns(bool){
- return true;
- }
-
- function _buildNftState(
- TvmCell code,
- uint256 id
- ) internal virtual override pure returns (TvmCell) {
- return tvm.buildStateInit({
- contr: Nft,
- varInit: {_id: id},
- code: code
- });
- }
-
-}
-```
-
-> TIP: You can use another samples from [everscale-tip-samples](https://github.com/itgoldio/everscale-tip-samples/tree/main/demo)
-
-# Build project
-
-1. build ```Nft.sol``` file to use [TON Solidity Compiler](https://github.com/tonlabs/TON-Solidity-Compiler.git)
- 1. ```solc Nft.sol --include-path node_modules```
-1. build ```Collection.sol``` file to use [TON Solidity Compiler](https://github.com/tonlabs/TON-Solidity-Compiler.git)
- 1. ```solc Collection.sol --include-path node_modules```
-1. compile ```Nft.code``` file to use [TVM linker](https://github.com/tonlabs/TVM-linker/releases/tag/0.14.2)
- 1. ```tvm_linker compile --abi-json Nft.abi.json Nft.code --lib stdlib_sol.tvm -o Nft.tvc```
-1. compile ```Collection.code``` file to use [TVM linker](https://github.com/tonlabs/TVM-linker/releases/tag/0.14.2)
- 1. ```tvm_linker compile --abi-json Collection.abi.json Collection.code --lib stdlib_sol.tvm -o Collection.tvc```
-
-# Deploy NFT
-
-Deploy ```Collection.tvc``` use [ever-sdk](https://github.com/tonlabs/ever-sdk) or [cli](https://github.com/tonlabs/tonos-cli)
-
diff --git a/contracts/CollectionBase.tsol b/contracts/CollectionBase.tsol
new file mode 100644
index 0000000..812f43d
--- /dev/null
+++ b/contracts/CollectionBase.tsol
@@ -0,0 +1,89 @@
+pragma ever-solidity >= 0.62.0;
+
+pragma AbiHeader expire;
+pragma AbiHeader time;
+pragma AbiHeader pubkey;
+
+
+import './TIP4_2/TIP4_2Collection.tsol';
+import './TIP4_3/TIP4_3Collection.tsol';
+import './NftBase.tsol';
+
+
+contract CollectionBase is TIP4_2Collection, TIP4_3Collection {
+
+ /**
+ * Errors
+ **/
+ uint8 constant sender_is_not_owner = 101;
+ uint8 constant value_is_less_than_required = 102;
+
+
+ /// _remainOnNft - the number of crystals that will remain after the entire mint
+ /// process is completed on the Nft contract
+ uint128 _remainOnNft = 0.3 ever;
+
+ constructor(
+ TvmCell codeNft,
+ TvmCell codeIndex,
+ TvmCell codeIndexBasis,
+ string json
+ ) TIP4_1Collection (
+ codeNft
+ ) TIP4_2Collection (
+ json
+ ) TIP4_3Collection (
+ codeIndex,
+ codeIndexBasis
+ ) public {
+ tvm.accept();
+ }
+
+ function _mintNft(
+ string json
+ ) internal {
+ require(msg.value > _remainOnNft + (2 * _indexDeployValue), value_is_less_than_required);
+ /// reserve original_balance
+ tvm.rawReserve(0, 4);
+
+ uint256 id = _totalSupply;
+ _totalSupply++;
+
+ TvmCell codeNft = _buildNftCode(address(this));
+ TvmCell stateNft = _buildNftState(codeNft, id);
+ address nftAddr = new NftBase{
+ stateInit: stateNft,
+ value: 0,
+ flag: 128
+ }(
+ msg.sender,
+ msg.sender,
+ _remainOnNft,
+ json,
+ _indexDeployValue,
+ _indexDestroyValue,
+ _codeIndex
+ );
+
+ emit NftCreated(
+ id,
+ nftAddr,
+ msg.sender,
+ msg.sender,
+ msg.sender
+ );
+
+ }
+
+ function _buildNftState(
+ TvmCell code,
+ uint256 id
+ ) internal virtual override(TIP4_2Collection, TIP4_3Collection) pure returns (TvmCell) {
+ return tvm.buildStateInit({
+ contr: NftBase,
+ varInit: {_id: id},
+ code: code
+ });
+ }
+
+}
diff --git a/contracts/NftBase.tsol b/contracts/NftBase.tsol
new file mode 100644
index 0000000..6349780
--- /dev/null
+++ b/contracts/NftBase.tsol
@@ -0,0 +1,71 @@
+pragma ever-solidity >= 0.62.0;
+
+pragma AbiHeader expire;
+pragma AbiHeader time;
+pragma AbiHeader pubkey;
+
+
+import './TIP4_1/TIP4_1Nft.tsol';
+import './TIP4_2/TIP4_2Nft.tsol';
+import './TIP4_3/TIP4_3Nft.tsol';
+
+
+contract NftBase is TIP4_1Nft, TIP4_2Nft, TIP4_3Nft {
+
+ constructor(
+ address owner,
+ address sendGasTo,
+ uint128 remainOnNft,
+ string json,
+ uint128 indexDeployValue,
+ uint128 indexDestroyValue,
+ TvmCell codeIndex
+ ) TIP4_1Nft(
+ owner,
+ sendGasTo,
+ remainOnNft
+ ) TIP4_2Nft (
+ json
+ ) TIP4_3Nft (
+ indexDeployValue,
+ indexDestroyValue,
+ codeIndex
+ ) public {
+ tvm.accept();
+ }
+
+ function _beforeTransfer(
+ address to,
+ address sendGasTo,
+ mapping(address => CallbackParams) callbacks
+ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) {
+ TIP4_3Nft._beforeTransfer(to, sendGasTo, callbacks);
+ }
+
+ function _afterTransfer(
+ address to,
+ address sendGasTo,
+ mapping(address => CallbackParams) callbacks
+ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) {
+ TIP4_3Nft._afterTransfer(to, sendGasTo, callbacks);
+ }
+
+ function _beforeChangeOwner(
+ address oldOwner,
+ address newOwner,
+ address sendGasTo,
+ mapping(address => CallbackParams) callbacks
+ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) {
+ TIP4_3Nft._beforeChangeOwner(oldOwner, newOwner, sendGasTo, callbacks);
+ }
+
+ function _afterChangeOwner(
+ address oldOwner,
+ address newOwner,
+ address sendGasTo,
+ mapping(address => CallbackParams) callbacks
+ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) {
+ TIP4_3Nft._afterChangeOwner(oldOwner, newOwner, sendGasTo, callbacks);
+ }
+
+}
\ No newline at end of file
diff --git a/contracts/TIP4_1/TIP4_1Collection.sol b/contracts/TIP4_1/TIP4_1Collection.tsol
similarity index 97%
rename from contracts/TIP4_1/TIP4_1Collection.sol
rename to contracts/TIP4_1/TIP4_1Collection.tsol
index aa43d38..70aa1c1 100644
--- a/contracts/TIP4_1/TIP4_1Collection.sol
+++ b/contracts/TIP4_1/TIP4_1Collection.tsol
@@ -8,9 +8,9 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import '../TIP6/TIP6.sol';
-import './interfaces/ITIP4_1Collection.sol';
-import './TIP4_1Nft.sol';
+import '../TIP6/TIP6.tsol';
+import './interfaces/ITIP4_1Collection.tsol';
+import './TIP4_1Nft.tsol';
/// @title One of the required contracts of an TIP4-1(Non-Fungible Token Standard) compliant technology.
diff --git a/contracts/TIP4_1/TIP4_1Nft.sol b/contracts/TIP4_1/TIP4_1Nft.tsol
similarity index 98%
rename from contracts/TIP4_1/TIP4_1Nft.sol
rename to contracts/TIP4_1/TIP4_1Nft.tsol
index 1f3763e..26e76a3 100644
--- a/contracts/TIP4_1/TIP4_1Nft.sol
+++ b/contracts/TIP4_1/TIP4_1Nft.tsol
@@ -8,12 +8,12 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import './interfaces/ITIP4_1NFT.sol';
-import './interfaces/INftChangeOwner.sol';
-import './interfaces/INftChangeManager.sol';
-import './interfaces/INftTransfer.sol';
+import './interfaces/ITIP4_1NFT.tsol';
+import './interfaces/INftChangeOwner.tsol';
+import './interfaces/INftChangeManager.tsol';
+import './interfaces/INftTransfer.tsol';
-import '../TIP6/TIP6.sol';
+import '../TIP6/TIP6.tsol';
/// @title One of the required contracts of an TIP4-1(Non-Fungible Token Standard) compliant technology.
diff --git a/contracts/TIP4_1/interfaces/INftChangeManager.sol b/contracts/TIP4_1/interfaces/INftChangeManager.tsol
similarity index 100%
rename from contracts/TIP4_1/interfaces/INftChangeManager.sol
rename to contracts/TIP4_1/interfaces/INftChangeManager.tsol
diff --git a/contracts/TIP4_1/interfaces/INftChangeOwner.sol b/contracts/TIP4_1/interfaces/INftChangeOwner.tsol
similarity index 96%
rename from contracts/TIP4_1/interfaces/INftChangeOwner.sol
rename to contracts/TIP4_1/interfaces/INftChangeOwner.tsol
index be91208..963392c 100644
--- a/contracts/TIP4_1/interfaces/INftChangeOwner.sol
+++ b/contracts/TIP4_1/interfaces/INftChangeOwner.tsol
@@ -1,3 +1,5 @@
+pragma ever-solidity ^0.62.0;
+
interface INftChangeOwner {
struct CallbackParams {
diff --git a/contracts/TIP4_1/interfaces/INftTransfer.sol b/contracts/TIP4_1/interfaces/INftTransfer.tsol
similarity index 96%
rename from contracts/TIP4_1/interfaces/INftTransfer.sol
rename to contracts/TIP4_1/interfaces/INftTransfer.tsol
index 2d7a8f5..c637f41 100644
--- a/contracts/TIP4_1/interfaces/INftTransfer.sol
+++ b/contracts/TIP4_1/interfaces/INftTransfer.tsol
@@ -1,3 +1,5 @@
+pragma ever-solidity ^0.62.0;
+
interface INftTransfer {
struct CallbackParams {
diff --git a/contracts/TIP4_1/interfaces/ITIP4_1Collection.sol b/contracts/TIP4_1/interfaces/ITIP4_1Collection.tsol
similarity index 100%
rename from contracts/TIP4_1/interfaces/ITIP4_1Collection.sol
rename to contracts/TIP4_1/interfaces/ITIP4_1Collection.tsol
diff --git a/contracts/TIP4_1/interfaces/ITIP4_1NFT.sol b/contracts/TIP4_1/interfaces/ITIP4_1NFT.tsol
similarity index 100%
rename from contracts/TIP4_1/interfaces/ITIP4_1NFT.sol
rename to contracts/TIP4_1/interfaces/ITIP4_1NFT.tsol
diff --git a/contracts/TIP4_2/TIP4_2Collection.sol b/contracts/TIP4_2/TIP4_2Collection.tsol
similarity index 92%
rename from contracts/TIP4_2/TIP4_2Collection.sol
rename to contracts/TIP4_2/TIP4_2Collection.tsol
index ad7e2ee..3f6cf55 100644
--- a/contracts/TIP4_2/TIP4_2Collection.sol
+++ b/contracts/TIP4_2/TIP4_2Collection.tsol
@@ -7,9 +7,9 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import '../TIP4_1/TIP4_1Collection.sol';
-import './interfaces/ITIP4_2JSON_Metadata.sol';
-import './TIP4_2Nft.sol';
+import '../TIP4_1/TIP4_1Collection.tsol';
+import './interfaces/ITIP4_2JSON_Metadata.tsol';
+import './TIP4_2Nft.tsol';
/// This contract implement TIP4_1Collection and ITIP4_2JSON_Metadata (add JSON Metadata)
diff --git a/contracts/TIP4_2/TIP4_2Nft.sol b/contracts/TIP4_2/TIP4_2Nft.tsol
similarity index 92%
rename from contracts/TIP4_2/TIP4_2Nft.sol
rename to contracts/TIP4_2/TIP4_2Nft.tsol
index 5f6cdc9..32c20b1 100644
--- a/contracts/TIP4_2/TIP4_2Nft.sol
+++ b/contracts/TIP4_2/TIP4_2Nft.tsol
@@ -7,8 +7,8 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import '../TIP4_1/TIP4_1Nft.sol';
-import './interfaces/ITIP4_2JSON_Metadata.sol';
+import '../TIP4_1/TIP4_1Nft.tsol';
+import './interfaces/ITIP4_2JSON_Metadata.tsol';
/// This contract implement TIP4_1Nft and ITIP4_2JSON_Metadata (add JSON Metadata)
diff --git a/contracts/TIP4_2/interfaces/ITIP4_2JSON_Metadata.sol b/contracts/TIP4_2/interfaces/ITIP4_2JSON_Metadata.tsol
similarity index 100%
rename from contracts/TIP4_2/interfaces/ITIP4_2JSON_Metadata.sol
rename to contracts/TIP4_2/interfaces/ITIP4_2JSON_Metadata.tsol
diff --git a/contracts/TIP4_3/Index.sol b/contracts/TIP4_3/Index.tsol
similarity index 98%
rename from contracts/TIP4_3/Index.sol
rename to contracts/TIP4_3/Index.tsol
index 5d993f1..f452413 100644
--- a/contracts/TIP4_3/Index.sol
+++ b/contracts/TIP4_3/Index.tsol
@@ -1,7 +1,7 @@
pragma ton-solidity >= 0.58.0;
-import 'interfaces/IIndex.sol';
+import 'interfaces/IIndex.tsol';
/**
diff --git a/contracts/TIP4_3/IndexBasis.sol b/contracts/TIP4_3/IndexBasis.tsol
similarity index 96%
rename from contracts/TIP4_3/IndexBasis.sol
rename to contracts/TIP4_3/IndexBasis.tsol
index d5be877..f42469e 100644
--- a/contracts/TIP4_3/IndexBasis.sol
+++ b/contracts/TIP4_3/IndexBasis.tsol
@@ -1,6 +1,6 @@
pragma ton-solidity >= 0.58.0;
-import './interfaces/IIndexBasis.sol';
+import './interfaces/IIndexBasis.tsol';
/**
* Errors
diff --git a/contracts/TIP4_3/TIP4_3Collection.sol b/contracts/TIP4_3/TIP4_3Collection.tsol
similarity index 94%
rename from contracts/TIP4_3/TIP4_3Collection.sol
rename to contracts/TIP4_3/TIP4_3Collection.tsol
index 7e63a70..6aec407 100644
--- a/contracts/TIP4_3/TIP4_3Collection.sol
+++ b/contracts/TIP4_3/TIP4_3Collection.tsol
@@ -7,11 +7,11 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import '../TIP4_1/TIP4_1Collection.sol';
-import './interfaces/ITIP4_3Collection.sol';
-import './TIP4_3Nft.sol';
-import './Index.sol';
-import './IndexBasis.sol';
+import '../TIP4_1/TIP4_1Collection.tsol';
+import './interfaces/ITIP4_3Collection.tsol';
+import './TIP4_3Nft.tsol';
+import './Index.tsol';
+import './IndexBasis.tsol';
/// This contract implement TIP4_1Collection, ITIP4_3Collection (add indexes)
@@ -64,7 +64,7 @@ abstract contract TIP4_3Collection is TIP4_1Collection, ITIP4_3Collection {
TvmCell code = _buildIndexBasisCode();
TvmCell state = _buildIndexBasisState(code, address(this));
- address indexBasis = new IndexBasis{stateInit: state, value: _deployIndexBasisValue}();
+ new IndexBasis{stateInit: state, value: _deployIndexBasisValue}();
}
/// @return code - code of IndexBasis contract
diff --git a/contracts/TIP4_3/TIP4_3Nft.sol b/contracts/TIP4_3/TIP4_3Nft.tsol
similarity index 94%
rename from contracts/TIP4_3/TIP4_3Nft.sol
rename to contracts/TIP4_3/TIP4_3Nft.tsol
index 6e7efd8..32abd1e 100644
--- a/contracts/TIP4_3/TIP4_3Nft.sol
+++ b/contracts/TIP4_3/TIP4_3Nft.tsol
@@ -7,9 +7,9 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import '../TIP4_1/TIP4_1Nft.sol';
-import './interfaces/ITIP4_3NFT.sol';
-import './Index.sol';
+import '../TIP4_1/TIP4_1Nft.tsol';
+import './interfaces/ITIP4_3NFT.tsol';
+import './Index.tsol';
/// This contract implement TIP4_1Collection, ITIP4_3NFT (add indexes)
@@ -46,6 +46,7 @@ abstract contract TIP4_3Nft is TIP4_1Nft, ITIP4_3NFT {
mapping(address => CallbackParams) callbacks
) internal virtual override {
_destructIndex(sendGasTo);
+ to; callbacks;
}
function _afterTransfer(
@@ -53,6 +54,7 @@ abstract contract TIP4_3Nft is TIP4_1Nft, ITIP4_3NFT {
address sendGasTo,
mapping(address => CallbackParams) callbacks
) internal virtual override {
+ to; sendGasTo; callbacks;
_deployIndex();
}
@@ -63,6 +65,7 @@ abstract contract TIP4_3Nft is TIP4_1Nft, ITIP4_3NFT {
mapping(address => CallbackParams) callbacks
) internal virtual override {
_destructIndex(sendGasTo);
+ oldOwner; newOwner; callbacks;
}
function _afterChangeOwner(
@@ -71,6 +74,7 @@ abstract contract TIP4_3Nft is TIP4_1Nft, ITIP4_3NFT {
address sendGasTo,
mapping(address => CallbackParams) callbacks
) internal virtual override {
+ oldOwner; newOwner; sendGasTo; callbacks;
_deployIndex();
}
diff --git a/contracts/TIP4_3/interfaces/IIndex.sol b/contracts/TIP4_3/interfaces/IIndex.tsol
similarity index 100%
rename from contracts/TIP4_3/interfaces/IIndex.sol
rename to contracts/TIP4_3/interfaces/IIndex.tsol
diff --git a/contracts/TIP4_3/interfaces/IIndexBasis.sol b/contracts/TIP4_3/interfaces/IIndexBasis.tsol
similarity index 100%
rename from contracts/TIP4_3/interfaces/IIndexBasis.sol
rename to contracts/TIP4_3/interfaces/IIndexBasis.tsol
diff --git a/contracts/TIP4_3/interfaces/ITIP4_3Collection.sol b/contracts/TIP4_3/interfaces/ITIP4_3Collection.tsol
similarity index 100%
rename from contracts/TIP4_3/interfaces/ITIP4_3Collection.sol
rename to contracts/TIP4_3/interfaces/ITIP4_3Collection.tsol
diff --git a/contracts/TIP4_3/interfaces/ITIP4_3NFT.sol b/contracts/TIP4_3/interfaces/ITIP4_3NFT.tsol
similarity index 100%
rename from contracts/TIP4_3/interfaces/ITIP4_3NFT.sol
rename to contracts/TIP4_3/interfaces/ITIP4_3NFT.tsol
diff --git a/contracts/TIP6/ITIP6.sol b/contracts/TIP6/ITIP6.tsol
similarity index 100%
rename from contracts/TIP6/ITIP6.sol
rename to contracts/TIP6/ITIP6.tsol
diff --git a/contracts/TIP6/TIP6.sol b/contracts/TIP6/TIP6.tsol
similarity index 94%
rename from contracts/TIP6/TIP6.sol
rename to contracts/TIP6/TIP6.tsol
index 6269d9b..0512fd6 100644
--- a/contracts/TIP6/TIP6.sol
+++ b/contracts/TIP6/TIP6.tsol
@@ -4,7 +4,7 @@ pragma AbiHeader expire;
pragma AbiHeader time;
pragma AbiHeader pubkey;
-import './ITIP6.sol';
+import './ITIP6.tsol';
abstract contract TIP6 is ITIP6 {
diff --git a/contracts/access/OwnableExternal.sol b/contracts/access/OwnableExternal.tsol
similarity index 100%
rename from contracts/access/OwnableExternal.sol
rename to contracts/access/OwnableExternal.tsol
diff --git a/contracts/access/OwnableInternal.sol b/contracts/access/OwnableInternal.tsol
similarity index 93%
rename from contracts/access/OwnableInternal.sol
rename to contracts/access/OwnableInternal.tsol
index d42c4db..2922956 100644
--- a/contracts/access/OwnableInternal.sol
+++ b/contracts/access/OwnableInternal.tsol
@@ -12,7 +12,7 @@ abstract contract OwnableInternal {
_transferOwnership(owner);
}
- function owner() public view virtual returns (address owner) {
+ function owner() public view virtual returns (address owner_) {
return _owner;
}
diff --git a/package-lock.json b/package-lock.json
index c198fed..1986350 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,13 +9,13 @@
"version": "1.1.4",
"license": "MIT",
"devDependencies": {
- "@types/chai": "^4.3.3",
- "@types/mocha": "^9.1.1",
- "@types/node": "^18.7.6",
- "chai": "^4.3.6",
- "everscale-standalone-client": "^2.0.27",
- "locklift": "^2.1.10",
- "prettier": "^2.7.1",
+ "@types/chai": "^4.3.4",
+ "@types/mocha": "^10.0.1",
+ "@types/node": "^18.15.11",
+ "chai": "^4.3.7",
+ "everscale-standalone-client": "^2.1.18",
+ "locklift": "^2.5.5",
+ "prettier": "^2.8.7",
"ts-mocha": "^10.0.0",
"typescript": "^4.7.4"
}
@@ -26,12 +26,58 @@
"integrity": "sha512-g464HtHHKxk6r6bkZc+lET1PuSgcFxlLHVb7EAqfxTlx6DRcYkjPRIQQhRHB3BQ6zRpfMrYkppL0tBtRED+HNA==",
"dev": true
},
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "dev": true
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
+ "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "dev": true
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "dev": true
+ },
"node_modules/@types/chai": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz",
- "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==",
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz",
+ "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==",
"dev": true
},
+ "node_modules/@types/commander": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/@types/commander/-/commander-2.12.2.tgz",
+ "integrity": "sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==",
+ "deprecated": "This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed!",
+ "dev": true,
+ "dependencies": {
+ "commander": "*"
+ }
+ },
"node_modules/@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -40,15 +86,30 @@
"optional": true
},
"node_modules/@types/mocha": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz",
- "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz",
+ "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==",
"dev": true
},
"node_modules/@types/node": {
- "version": "18.7.13",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz",
- "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==",
+ "version": "18.16.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz",
+ "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==",
+ "dev": true
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.24",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+ "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
"dev": true
},
"node_modules/@ungap/promise-all-settled": {
@@ -228,14 +289,14 @@
}
},
"node_modules/chai": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
- "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
"dev": true,
"dependencies": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
+ "deep-eql": "^4.1.2",
"get-func-name": "^2.0.0",
"loupe": "^2.3.1",
"pathval": "^1.1.1",
@@ -449,12 +510,12 @@
}
},
"node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"dev": true,
"engines": {
- "node": ">= 10"
+ "node": "^12.20.0 || >=14"
}
},
"node_modules/concat-map": {
@@ -499,15 +560,15 @@
}
},
"node_modules/deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
"dev": true,
"dependencies": {
"type-detect": "^4.0.0"
},
"engines": {
- "node": ">=0.12"
+ "node": ">=6"
}
},
"node_modules/deep-extend": {
@@ -528,6 +589,15 @@
"node": ">=0.4.0"
}
},
+ "node_modules/detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/diff": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
@@ -617,26 +687,38 @@
"dev": true
},
"node_modules/everscale-inpage-provider": {
- "version": "0.3.37",
- "resolved": "https://registry.npmjs.org/everscale-inpage-provider/-/everscale-inpage-provider-0.3.37.tgz",
- "integrity": "sha512-OKgFwA0e9B11pOKRkN8cFPr7uxu07638ZgfYrE0OrdtxSbNhGq9e30YTuxv/1dgtm6jDPHip3TewwEdD8atd2g==",
+ "version": "0.3.58",
+ "resolved": "https://registry.npmjs.org/everscale-inpage-provider/-/everscale-inpage-provider-0.3.58.tgz",
+ "integrity": "sha512-iCRmahP9rxtZQ2rfF2NSOpu3gmWSa7zoqa4kTCizWwG+lU5q7nnixZdNQUFZ9DbYDjbWebN7W6fMkXGcZrQYWw==",
"dev": true
},
"node_modules/everscale-standalone-client": {
- "version": "2.0.28",
- "resolved": "https://registry.npmjs.org/everscale-standalone-client/-/everscale-standalone-client-2.0.28.tgz",
- "integrity": "sha512-DNLhBqXMTKdq8bzk382YiUgTi6FnIucAAVcrkCZLDIj4PdRaADlUJn1E188uICFCYiYFMNi2mKwq2yZw2r/NTA==",
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/everscale-standalone-client/-/everscale-standalone-client-2.1.18.tgz",
+ "integrity": "sha512-Uool0hKu0U+DAiXqwon1mqQ6+z52h7D8dLgvDvwbdzZZ3cni8OY9nFTZsxZPFZVEtKj4qK4CsofrRhKMdxPDpQ==",
"dev": true,
"dependencies": {
"@broxus/await-semaphore": "^0.1.5",
"bignumber.js": "^9.1.0",
"events": "^3.3.0",
- "everscale-inpage-provider": "^0.3.37",
+ "everscale-inpage-provider": "^0.3.55",
"fast-safe-stringify": "^2.1.1",
- "nekoton-wasm": "^1.0.0",
+ "nekoton-wasm": "^1.1.2",
"node-fetch": "^2.6.7"
}
},
+ "node_modules/expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
@@ -676,6 +758,16 @@
"node": ">=8"
}
},
+ "node_modules/find-node-modules": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz",
+ "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==",
+ "dev": true,
+ "dependencies": {
+ "findup-sync": "^4.0.0",
+ "merge": "^2.1.1"
+ }
+ },
"node_modules/find-replace": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
@@ -704,6 +796,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/findup-sync": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+ "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/flat": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
@@ -840,6 +947,36 @@
"node": ">= 6"
}
},
+ "node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -864,6 +1001,18 @@
"he": "bin/he"
}
},
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -880,6 +1029,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -952,6 +1107,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
"node_modules/jake": {
"version": "10.8.5",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
@@ -970,6 +1140,19 @@
"node": ">=10"
}
},
+ "node_modules/joi": {
+ "version": "17.9.2",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz",
+ "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0",
+ "@hapi/topo": "^5.0.0",
+ "@sideway/address": "^4.1.3",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -983,9 +1166,9 @@
}
},
"node_modules/json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"optional": true,
"dependencies": {
@@ -1023,22 +1206,26 @@
}
},
"node_modules/locklift": {
- "version": "2.1.10",
- "resolved": "https://registry.npmjs.org/locklift/-/locklift-2.1.10.tgz",
- "integrity": "sha512-0Hqrhv5MBDZJtRHJD7bF8lgnsBQkAWrVeAxQ9o9pLTZ4eUCAGOCvOqY93dT67pHGUe/08vkVeWv32G7BBj44zQ==",
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/locklift/-/locklift-2.5.5.tgz",
+ "integrity": "sha512-8UQkCn3JdYnRK9fVkb89gjBBlp8KZj4MJrWwTEkk/rYJF5K/6RurVaAEyRg4mY7PN3Dzu/JOXZ+MbtcekfMN3A==",
"dev": true,
"dependencies": {
+ "@types/commander": "^2.12.2",
+ "@types/yargs": "^17.0.13",
"axios": "^0.27.2",
"bignumber.js": "^9.0.1",
"chalk": "^4.1.2",
- "commander": "^7.2.0",
+ "commander": "^9.4.1",
"directory-tree": "^3.2.2",
"ejs": "^3.1.6",
"env-paths": "^2.2.1",
"everscale-crypto": "^0.1.1",
- "everscale-inpage-provider": "^0.3.34",
- "everscale-standalone-client": "^2.0.27",
+ "everscale-inpage-provider": "^0.3.58",
+ "everscale-standalone-client": "^2.1.18",
+ "find-node-modules": "^2.1.3",
"fs-extra": "^10.1.0",
+ "joi": "^17.8.3",
"lodash": "^4.17.21",
"mocha": "^10.0.0",
"node-gzip": "^1.1.2",
@@ -1048,15 +1235,58 @@
"ts-mocha": "^10.0.0",
"tsconfig-paths": "^4.0.0",
"typescript": "^4.7.4",
- "underscore": "^1.13.1"
+ "typescript-tuple": "^5.0.1",
+ "underscore": "^1.13.1",
+ "yargs": "^17.6.0"
},
"bin": {
- "locklift": "build/cli/index.js"
+ "locklift": "internal/cli/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
+ "node_modules/locklift/node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/locklift/node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/locklift/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -1106,6 +1336,25 @@
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
+ "node_modules/merge": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
+ "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+ "dev": true
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -1266,9 +1515,9 @@
}
},
"node_modules/nekoton-wasm": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/nekoton-wasm/-/nekoton-wasm-1.0.0.tgz",
- "integrity": "sha512-Slpt/DzE6bNl8zTCaWHsyujFGaVUf8quiZkgcxw5wfbTOGzG9hY3MU34k0H1HjolLZW2J9ftMxh/7BynjzOfHA==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/nekoton-wasm/-/nekoton-wasm-1.1.5.tgz",
+ "integrity": "sha512-3gnWPKEyBfICAc84WNj4FbQEmga8N4oGcto/vf522trs+16wR6Fh4c+0ZSW/lIPKogciCowYzPjVzATz2eZDNA==",
"dev": true
},
"node_modules/no-case": {
@@ -1354,6 +1603,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -1394,9 +1652,9 @@
}
},
"node_modules/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@@ -1447,6 +1705,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/rxjs": {
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
@@ -1736,9 +2007,9 @@
}
},
"node_modules/tsconfig-paths/node_modules/json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"bin": {
"json5": "lib/cli.js"
@@ -1775,6 +2046,30 @@
"node": ">=4.2.0"
}
},
+ "node_modules/typescript-compare": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz",
+ "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==",
+ "dev": true,
+ "dependencies": {
+ "typescript-logic": "^0.0.0"
+ }
+ },
+ "node_modules/typescript-logic": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz",
+ "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==",
+ "dev": true
+ },
+ "node_modules/typescript-tuple": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-5.0.1.tgz",
+ "integrity": "sha512-QdAYG/L0vUwtJUVGHmp+Jt8/2l+gOMFwCwLpIhUHNDUxyLWOxuDR/2HWNUNGJtZJuoDvOF3yXMSeK9h90H0OiA==",
+ "dev": true,
+ "dependencies": {
+ "typescript-compare": "^0.0.2"
+ }
+ },
"node_modules/typical": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
@@ -1830,6 +2125,18 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
"node_modules/wordwrapjs": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
diff --git a/package.json b/package.json
index e9101fc..55ab2ec 100644
--- a/package.json
+++ b/package.json
@@ -1,41 +1,211 @@
{
- "name": "@itgold/everscale-tip",
- "version": "1.1.4",
- "description": "Secure Smart Contract library for Solidity",
+ "name": "tip4",
+ "version": "1.1.6",
+ "description": "TIP-4 NFT Smart Contracts for TVM-compatible networks",
"files": [
"/contracts/**"
],
"scripts": {
- "test": "cd test && npx locklift test --network rfld"
+ "test": "cd test && npx locklift test -n local"
},
"repository": {
"type": "git",
- "url": "git+https://github.com/itgoldio/everscale-tip4.git"
+ "url": "git+https://github.com/qwadratic/tip4.git"
},
"author": "ITgold ",
"license": "MIT",
"bugs": {
- "url": "https://github.com/itgoldio/everscale-tip4/issues"
+ "url": "https://github.com/qwadratic/tip4/issues"
},
- "homepage": "https://github.com/itgoldio/everscale-tip4#readme",
+ "homepage": "https://github.com/qwadratic/tip4#readme",
"keywords": [
"solidity",
+ "tsol",
+ "venom",
"everscale",
"smart",
"contracts",
- "security",
- "nft",
- "ITgold"
+ "nft"
],
"devDependencies": {
- "@types/chai": "^4.3.3",
- "@types/mocha": "^9.1.1",
- "@types/node": "^18.7.6",
- "chai": "^4.3.6",
- "everscale-standalone-client": "^2.0.27",
- "locklift": "^2.1.10",
- "prettier": "^2.7.1",
+ "@types/chai": "^4.3.4",
+ "@types/mocha": "^10.0.1",
+ "@types/node": "^18.15.11",
+ "chai": "^4.3.7",
+ "everscale-standalone-client": "^2.1.18",
+ "locklift": "^2.5.5",
+ "prettier": "^2.8.7",
"ts-mocha": "^10.0.0",
"typescript": "^4.7.4"
+ },
+ "main": "index.js",
+ "directories": {
+ "test": "test"
+ },
+ "dependencies": {
+ "ansi-styles": "^4.3.0",
+ "ansi-regex": "^5.0.1",
+ "arrify": "^1.0.1",
+ "assertion-error": "^1.1.0",
+ "argparse": "^2.0.1",
+ "async": "^3.2.4",
+ "asynckit": "^0.4.0",
+ "anymatch": "^3.1.2",
+ "bignumber.js": "^9.1.0",
+ "ansi-colors": "^4.1.1",
+ "brace-expansion": "^2.0.1",
+ "array-back": "^3.1.0",
+ "braces": "^3.0.2",
+ "browser-stdout": "^1.3.1",
+ "axios": "^0.27.2",
+ "balanced-match": "^1.0.2",
+ "buffer-from": "^1.1.2",
+ "check-error": "^1.0.2",
+ "binary-extensions": "^2.2.0",
+ "camelcase": "^6.3.0",
+ "combined-stream": "^1.0.8",
+ "color-convert": "^2.0.1",
+ "chalk": "^4.1.2",
+ "command-line-args": "^5.2.1",
+ "chokidar": "^3.5.3",
+ "commander": "^9.5.0",
+ "concat-map": "^0.0.1",
+ "deep-eql": "^4.1.3",
+ "debug": "^4.3.4",
+ "color-name": "^1.1.4",
+ "deep-extend": "^0.6.0",
+ "delayed-stream": "^1.0.0",
+ "detect-file": "^1.0.0",
+ "cliui": "^7.0.4",
+ "emoji-regex": "^8.0.0",
+ "escalade": "^3.1.1",
+ "directory-tree": "^3.3.0",
+ "events": "^3.3.0",
+ "everscale-crypto": "^0.1.1",
+ "everscale-inpage-provider": "^0.3.58",
+ "env-paths": "^2.2.1",
+ "decamelize": "^4.0.0",
+ "expand-tilde": "^2.0.2",
+ "diff": "^5.0.0",
+ "command-line-usage": "^6.1.3",
+ "escape-string-regexp": "^1.0.5",
+ "ejs": "^3.1.8",
+ "fill-range": "^7.0.1",
+ "fast-safe-stringify": "^2.1.1",
+ "find-node-modules": "^2.1.3",
+ "findup-sync": "^4.0.0",
+ "find-replace": "^3.0.0",
+ "filelist": "^1.0.4",
+ "find-up": "^5.0.0",
+ "follow-redirects": "^1.15.1",
+ "fs-extra": "^10.1.0",
+ "fs.realpath": "^1.0.0",
+ "flat": "^5.0.2",
+ "fsevents": "^2.3.2",
+ "get-stdin": "^5.0.1",
+ "get-func-name": "^2.0.0",
+ "global-prefix": "^1.0.2",
+ "get-caller-file": "^2.0.5",
+ "global-modules": "^1.0.0",
+ "form-data": "^4.0.0",
+ "has-flag": "^4.0.0",
+ "he": "^1.2.0",
+ "ini": "^1.3.8",
+ "homedir-polyfill": "^1.0.3",
+ "glob-parent": "^5.1.2",
+ "graceful-fs": "^4.2.10",
+ "glob": "^7.2.0",
+ "inflight": "^1.0.6",
+ "is-extglob": "^2.1.1",
+ "is-fullwidth-code-point": "^3.0.0",
+ "is-binary-path": "^2.1.0",
+ "inherits": "^2.0.4",
+ "is-number": "^7.0.0",
+ "is-glob": "^4.0.3",
+ "joi": "^17.9.2",
+ "is-unicode-supported": "^0.1.0",
+ "is-plain-obj": "^2.1.0",
+ "is-windows": "^1.0.2",
+ "jsonfile": "^6.1.0",
+ "isexe": "^2.0.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "json5": "^1.0.2",
+ "locate-path": "^6.0.0",
+ "make-error": "^1.3.6",
+ "lodash": "^4.17.21",
+ "jake": "^10.8.5",
+ "loupe": "^2.3.4",
+ "merge": "^2.1.1",
+ "micromatch": "^4.0.5",
+ "lodash.camelcase": "^4.3.0",
+ "mime-db": "^1.52.0",
+ "mime-types": "^2.1.35",
+ "mkdirp": "^0.5.6",
+ "nekoton-wasm": "^1.1.5",
+ "ms": "^2.1.3",
+ "lower-case": "^1.1.4",
+ "minimatch": "^3.1.2",
+ "no-case": "^2.3.2",
+ "nanoid": "^3.3.3",
+ "node-gzip": "^1.1.2",
+ "node-fetch": "^2.6.7",
+ "normalize-path": "^3.0.0",
+ "parse-passwd": "^1.0.0",
+ "minimist": "^1.2.6",
+ "once": "^1.4.0",
+ "path-is-absolute": "^1.0.1",
+ "pathval": "^1.1.1",
+ "path-exists": "^4.0.0",
+ "reduce-flatten": "^2.0.0",
+ "require-directory": "^2.1.1",
+ "picomatch": "^2.3.1",
+ "p-limit": "^3.1.0",
+ "p-locate": "^5.0.0",
+ "readdirp": "^3.6.0",
+ "randombytes": "^2.1.0",
+ "resolve-dir": "^1.0.1",
+ "source-map": "^0.6.1",
+ "sentence-case": "^2.1.1",
+ "safe-buffer": "^5.2.1",
+ "serialize-javascript": "^6.0.0",
+ "strip-ansi": "^6.0.1",
+ "string-width": "^4.2.3",
+ "source-map-support": "^0.5.21",
+ "split-text-to-chunks": "^1.0.0",
+ "supports-color": "^7.2.0",
+ "strip-bom": "^3.0.0",
+ "strip-json-comments": "^3.1.1",
+ "tablemark": "^2.0.0",
+ "to-regex-range": "^5.0.1",
+ "ts-node": "^7.0.1",
+ "tr46": "^0.0.3",
+ "tsconfig-paths": "^4.1.0",
+ "table-layout": "^1.0.2",
+ "typescript-compare": "^0.0.2",
+ "typescript-logic": "^0.0.0",
+ "superstruct": "^0.16.0",
+ "tslib": "^2.4.0",
+ "typescript-tuple": "^5.0.1",
+ "rxjs": "^7.5.6",
+ "typical": "^4.0.0",
+ "underscore": "^1.13.4",
+ "upper-case": "^1.1.3",
+ "type-detect": "^4.0.8",
+ "universalify": "^2.0.0",
+ "webidl-conversions": "^3.0.1",
+ "whatwg-url": "^5.0.0",
+ "which": "^1.3.1",
+ "upper-case-first": "^1.1.2",
+ "wrap-ansi": "^7.0.0",
+ "yargs-parser": "^20.2.4",
+ "wrappy": "^1.0.2",
+ "y18n": "^5.0.8",
+ "yargs": "^16.2.0",
+ "workerpool": "^6.2.1",
+ "wordwrapjs": "^4.0.1",
+ "yargs-unparser": "^2.0.0",
+ "yn": "^2.0.0",
+ "yocto-queue": "^0.1.0"
}
}
diff --git a/test/build/OwnableExternalContract.base64 b/test/build/OwnableExternalContract.base64
index 113e9ad..42090d6 100644
--- a/test/build/OwnableExternalContract.base64
+++ b/test/build/OwnableExternalContract.base64
@@ -1 +1 @@
-te6ccgECFQEAAqoAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsSBQQUArztRNDXScMB+GYh2zzTAAGOHIMI1xgg+QEB0wABlNP/AwGTAvhC4iD4ZfkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8DwYDeu1E0NdJwwH4ZiLQ0wP6QDD4aak4APhEf29xggiYloBvcm1vc3BvdPhk3CHHAOMCIdcNH/K8IeMDAds88jwREQYDPCCCEDyR4cW64wIgghBYWpBkuuMCIIIQd/wgvLrjAgwJBwPeMPhG8uBM+EJu4wDTH/hEWG91+GTR2zwhjhoj0NMB+kAwMcjPhyDOghD3/CC8zwuBy//JcI4y+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ABxzwtpAcj4RG8Vzwsfy//NyfhEbxTi+wDjAPIAEAsIACjtRNDT/9M/MfhDWMjL/8s/zsntVAM2MPhG8uBM+EJu4wAhk9TR0N7T/9HbPDDbPPIAEAoNAizbPPhFIG6SMHDeuvLgZPgAIPLgZNs8Cw4AIPhEcG9ygEBvdHBvcfhk+EoDNjD4Qm7jAPhG8nMhk9TR0N7T/9HbPPgA2zzyAA8ODQAs+Ev4SvhD+ELIy//LP8+Dy//LD8ntVABG+Eoh+GqNBHAAAAAAAAAAAAAAAAAU2zT8oMjOy//L/8lw+wABYu1E0NdJwgGOJnDtRND0BXBxIoBA9A5vkZPXCw/e+Gv4aoBA9A7yvdcL//hicPhj4w0QAC7tRNDT/9M/0wAx0//TD9H4a/hq+GP4YgAK+Eby4EwCCvSkIPShFBMAFHNvbCAwLjYxLjIAAA==
\ No newline at end of file
+te6ccgECFQEAAqoAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsSBQQUArztRNDXScMB+GYh2zzTAAGOHIMI1xgg+QEB0wABlNP/AwGTAvhC4iD4ZfkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8DwYDeu1E0NdJwwH4ZiLQ0wP6QDD4aak4APhEf29xggiYloBvcm1vc3BvdPhk3CHHAOMCIdcNH/K8IeMDAds88jwREQYDPCCCEDyR4cW64wIgghBYWpBkuuMCIIIQd/wgvLrjAgwJBwPeMPhG8uBM+EJu4wDTH/hEWG91+GTR2zwhjhoj0NMB+kAwMcjPhyDOghD3/CC8zwuBy//JcI4y+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ABxzwtpAcj4RG8Vzwsfy//NyfhEbxTi+wDjAPIAEAsIACjtRNDT/9M/MfhDWMjL/8s/zsntVAM2MPhG8uBM+EJu4wAhk9TR0N7T/9HbPDDbPPIAEAoNAizbPPhFIG6SMHDeuvLgZPgAIPLgZNs8Cw4AIPhEcG9ygEBvdHBvcfhk+EoDNjD4Qm7jAPhG8nMhk9TR0N7T/9HbPPgA2zzyAA8ODQAs+Ev4SvhD+ELIy//LP8+Dy//LD8ntVABG+Eoh+GqNBHAAAAAAAAAAAAAAAAAU2zT8oMjOy//L/8lw+wABYu1E0NdJwgGOJnDtRND0BXBxIoBA9A5vkZPXCw/e+Gv4aoBA9A7yvdcL//hicPhj4w0QAC7tRNDT/9M/0wAx0//TD9H4a/hq+GP4YgAK+Eby4EwCCvSkIPShFBMAFHNvbCAwLjYyLjAAAA==
\ No newline at end of file
diff --git a/test/build/OwnableExternalContract.tvc b/test/build/OwnableExternalContract.tvc
index 60295de..1f3132c 100644
Binary files a/test/build/OwnableExternalContract.tvc and b/test/build/OwnableExternalContract.tvc differ
diff --git a/test/build/OwnableInternalContract.abi.json b/test/build/OwnableInternalContract.abi.json
index 9a88906..af2354e 100644
--- a/test/build/OwnableInternalContract.abi.json
+++ b/test/build/OwnableInternalContract.abi.json
@@ -16,7 +16,7 @@
"inputs": [
],
"outputs": [
- {"name":"owner","type":"address"}
+ {"name":"owner_","type":"address"}
]
},
{
diff --git a/test/build/OwnableInternalContract.base64 b/test/build/OwnableInternalContract.base64
index d95737f..432316a 100644
--- a/test/build/OwnableInternalContract.base64
+++ b/test/build/OwnableInternalContract.base64
@@ -1 +1 @@
-te6ccgECFwEAAoQAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsUBQQWA7ztRNDXScMB+GaJ+Gkh2zzTAAGOGYMI1xgg+QEB0wABlNP/AwGTAvhC4vkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8DAoGA1LtRNDXScMB+GYi0NMD+kAw+GmpOADcIccA4wIh1w0f8rwh4wMB2zzyPBMTBgM8IIIQDgTSnrrjAiCCEEdWVNy64wIgghBfC8/euuMCDQkHA24w+Eby4Ez4Qm7jANHbPCGOHyPQ0wH6QDAxyM+HIM5xzwthAcjPk3wvP3rOzclw+wCRMOLjAPIAEhEIACjtRNDT/9M/MfhDWMjL/8s/zsntVAM2MPhCbuMA+EbycyGT1NHQ3vpA0ds8+ADbPPIAChAOAhbtRNDXScIBjoDjDQsSAUxw7UTQ9AWJcSKAQPQOb5GT1wsP3vhr+GqAQPQO8r3XC//4YnD4YwwAQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABADNjD4RvLgTPhCbuMAIZPU0dDe+kDR2zww2zzyABIPDgAq+Ev4SvhD+ELIy//LP8+DzssPye1UAjrbPPhJxwXy4GRopv5g8uBlIPpCbxPXC//y4GTbPBEQAFD4SiH4aovcAAAAAAAAAAAAAAAAGMjOWcjPkYRXwcrOAcjOzc3JcPsAAAT4SgAu7UTQ0//TP9MAMfpA0w/R+Gv4avhj+GIACvhG8uBMAgr0pCD0oRYVABRzb2wgMC42MS4yAAA=
\ No newline at end of file
+te6ccgECFwEAAoQAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsUBQQWA7ztRNDXScMB+GaJ+Gkh2zzTAAGOGYMI1xgg+QEB0wABlNP/AwGTAvhC4vkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8DAoGA1LtRNDXScMB+GYi0NMD+kAw+GmpOADcIccA4wIh1w0f8rwh4wMB2zzyPBMTBgM8IIIQDgTSnrrjAiCCEEdWVNy64wIgghBfC8/euuMCDQkHA24w+Eby4Ez4Qm7jANHbPCGOHyPQ0wH6QDAxyM+HIM5xzwthAcjPk3wvP3rOzclw+wCRMOLjAPIAEhEIACjtRNDT/9M/MfhDWMjL/8s/zsntVAM2MPhCbuMA+EbycyGT1NHQ3vpA0ds8+ADbPPIAChAOAhbtRNDXScIBjoDjDQsSAUxw7UTQ9AWJcSKAQPQOb5GT1wsP3vhr+GqAQPQO8r3XC//4YnD4YwwAQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABADNjD4RvLgTPhCbuMAIZPU0dDe+kDR2zww2zzyABIPDgAq+Ev4SvhD+ELIy//LP8+DzssPye1UAjrbPPhJxwXy4GRopv5g8uBlIPpCbxPXC//y4GTbPBEQAFD4SiH4aovcAAAAAAAAAAAAAAAAGMjOWcjPkYRXwcrOAcjOzc3JcPsAAAT4SgAu7UTQ0//TP9MAMfpA0w/R+Gv4avhj+GIACvhG8uBMAgr0pCD0oRYVABRzb2wgMC42Mi4wAAA=
\ No newline at end of file
diff --git a/test/build/OwnableInternalContract.tvc b/test/build/OwnableInternalContract.tvc
index 42eaa6b..50e4690 100644
Binary files a/test/build/OwnableInternalContract.tvc and b/test/build/OwnableInternalContract.tvc differ
diff --git a/test/build/TIP4_1CollectionCon.base64 b/test/build/TIP4_1CollectionCon.base64
index b2794e5..3061fad 100644
--- a/test/build/TIP4_1CollectionCon.base64
+++ b/test/build/TIP4_1CollectionCon.base64
@@ -1 +1 @@
-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
\ No newline at end of file
+te6ccgECKgEABvgAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsnBQQpArbtRNDXScMB+GYh2zzTAAGOGYMI1xgg+QEB0wABlNP/AwGTAvhC4vkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8GAYDeu1E0NdJwwH4ZiLQ0wP6QDD4aak4APhEf29xggiYloBvcm1vc3BvdPhk3CHHAOMCIdcNH/K8IeMDAds88jwmJgYCKCCCEC7S+/u74wIgghBhHwBku+MCEQcEUCCCEC7exju64wIgghAyBOwpuuMCIIIQUnnncLrjAiCCEGEfAGS64wIPDQoIA9gw+Eby4Ez4Qm7jANMf+ERYb3X4ZNHbPCGOGiPQ0wH6QDAxyM+HIM6CEOEfAGTPC4HLf8lwji/4RCBvEyFvEvhJVQJvEcjPhIDKAM+EQM4B+gL0AIBqz0D4RG8Vzwsfy3/J+ERvFOL7AOMA8gAlCR0AIPhEcG9ygEBvdHBvcfhk+EwD8jD4RvLgTPhCbuMA0x/4RFhvdfhkIZPU0dDe0//R2zwhjh0j0NMB+kAwMcjPhyDOcc8LYQHIz5NJ553Czs3JcI4x+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ABxzwtpAcj4RG8Vzwsfzs3J+ERvFOL7AOMA8gAlCx0BIPhEcG9ygEBvdHBvcfhk2zwMAjL4KNs8Ads8+QD4KPpCbxLIz4ZAygfL/8nQHxUD3DD4RvLgTPhCbuMA0x/4RFhvdfhk0x/R2zwhjhoj0NMB+kAwMcjPhyDOghCyBOwpzwuBygDJcI4v+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ACAas9A+ERvFc8LH8oAyfhEbxTi+wDjAPIAJQ4dADb4RHBvcoBAb3Rwb3H4ZPhKgCD0Dm+Rk9cKAN4D3jD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4aI9DTAfpAMDHIz4cgzoIQrt7GO88Lgcv/yXCOMvhEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAcc8LaQHI+ERvFc8LH8v/zcn4RG8U4vsA4wDyACUQHQEo+ERwb3KAQG90cG9x+GT4KNs8+QAfBFAgghAPr4uEuuMCIIIQFu37WbrjAiCCEByK6Ru64wIgghAu0vv7uuMCHBoWEgOEMPhG8uBM+EJu4wAhk9TR0N7Tf/pA0ds8IY4fI9DTAfpAMDHIz4cgznHPC2EByM+Su0vv7s7NyXD7AJEw4jDbPPIAJRMXA774APgo2zxY2zyCEBHhowD4KFog+QDIz4oAQMv/ydBVMCTIz4WIzoKAIO5rKAAAAAAAAAAAAAAAAAADzwuOIds8zM+DVSDIz5EVPE+yzlnIzst/zc3JcfsA+EyktX/4bB8VFAA00NIAAZPSBDHe0gABk9IBMd70BPQE9ATRXwMASHDIy/9wbYBA9EMByMv/cViAQPRDyPQAyQHIz4SA9AD0AM+ByQKeMPhCbuMA+Ebyc9TR+AD4a4IQMgTsKfhKyM+DWYAg9EMg+GqCEGEfAGSCEA+vi4SyghAu3sY7soIQUnnncLIByM+DWYAg9EP4avgA2zzyABgXADL4TPhL+Er4Q/hCyMv/yz/Pg/QAzMt/ye1UAhbtRNDXScIBjoDjDRklATpw7UTQ9AVtiHD4bPhr+GqAQPQO8r3XC//4YnD4YykD1DD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4ZI9DTAfpAMDHIz4cgzoIQlu37Wc8LgczJcI4u+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ACAas9A+ERvFc8LH8zJ+ERvFOL7AOMA8gAlGx0AIPhEcG9ygEBvdHBvcfhk+EsD1DD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4ZI9DTAfpAMDHIz4cgzoIQj6+LhM8LgczJcI4u+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ACAas9A+ERvFc8LH8zJ+ERvFOL7AOMA8gAlHh0AKO1E0NP/0z8x+ENYyMv/yz/Oye1UAST4RHBvcoBAb3Rwb3H4ZPgo2zwfARLIzvhL0AHJ2zwgAhYhizits1jHBYqK4iIhAQgB2zzJIwEmAdTUMBLQ2zzIz44rbNYSzM8RySMBZtWLL0pA1yb0BNMJMSDXSpHUjoDiiy9KGNcmMAHIz4vSkPQAgCDPCwnPi9KGzBLMyM8RziQBBIgBKQA07UTQ0//TP9MAMfQE1NN/0fhs+Gv4avhj+GIACvhG8uBMAgr0pCD0oSkoABRzb2wgMC42Mi4wAAA=
\ No newline at end of file
diff --git a/test/build/TIP4_1CollectionCon.tvc b/test/build/TIP4_1CollectionCon.tvc
index da4cafa..a65feb4 100644
Binary files a/test/build/TIP4_1CollectionCon.tvc and b/test/build/TIP4_1CollectionCon.tvc differ
diff --git a/test/build/TIP4_1NftCon.base64 b/test/build/TIP4_1NftCon.base64
index d590107..5c043e9 100644
--- a/test/build/TIP4_1NftCon.base64
+++ b/test/build/TIP4_1NftCon.base64
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/test/build/TIP4_1NftCon.tvc b/test/build/TIP4_1NftCon.tvc
index df239a7..2aabf56 100644
Binary files a/test/build/TIP4_1NftCon.tvc and b/test/build/TIP4_1NftCon.tvc differ
diff --git a/test/build/TIP4_2CollectionCon.base64 b/test/build/TIP4_2CollectionCon.base64
index 9abe511..bcb74da 100644
--- a/test/build/TIP4_2CollectionCon.base64
+++ b/test/build/TIP4_2CollectionCon.base64
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/test/build/TIP4_2CollectionCon.tvc b/test/build/TIP4_2CollectionCon.tvc
index e68d186..e10c6a1 100644
Binary files a/test/build/TIP4_2CollectionCon.tvc and b/test/build/TIP4_2CollectionCon.tvc differ
diff --git a/test/build/TIP4_2NftCon.base64 b/test/build/TIP4_2NftCon.base64
index 8ac4047..a71ad11 100644
--- a/test/build/TIP4_2NftCon.base64
+++ b/test/build/TIP4_2NftCon.base64
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/test/build/TIP4_2NftCon.tvc b/test/build/TIP4_2NftCon.tvc
index fe3b9d9..b92b828 100644
Binary files a/test/build/TIP4_2NftCon.tvc and b/test/build/TIP4_2NftCon.tvc differ
diff --git a/test/build/TIP4_3CollectionCon.base64 b/test/build/TIP4_3CollectionCon.base64
index c145ee8..307fc71 100644
--- a/test/build/TIP4_3CollectionCon.base64
+++ b/test/build/TIP4_3CollectionCon.base64
@@ -1 +1 @@
-te6ccgECOgEACvYAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gs3BQQ5ArbtRNDXScMB+GYh2zzTAAGOGYMI1xgg+QEB0wABlNP/AwGTAvhC4vkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8MAYDeu1E0NdJwwH4ZiLQ0wP6QDD4aak4APhEf29xggiYloBvcm1vc3BvdPhk3CHHAOMCIdcNH/K8IeMDAds88jw2NgYEUCCCEBTMp8a74wIgghA0c9dcu+MCIIIQYR8AZLvjAiCCEGXKCwK64wIdFAkHAzow+Eby4Ez4Qm7jACGT1NHQ3tN/+kDR2zww2zzyADUIJQPI+AD4TKS1f/hs+CjbPFjbPPhN+FD4T/hSJVUUIPkAyM+KAEDL/8nQyM+FiM6CgCFNyTgAAAAAAAAAAAAAAAAAA88LjiHbPMzPg1VQyM+RQb/k6s5VQMjOy3/Lf8t/zM3NyXH7ACIRJwRQIIIQONt4hrrjAiCCEFJ553C64wIgghBYNi2CuuMCIIIQYR8AZLrjAhIODAoD2DD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4aI9DTAfpAMDHIz4cgzoIQ4R8AZM8Lgct/yXCOL/hEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAgGrPQPhEbxXPCx/Lf8n4RG8U4vsA4wDyADULMwAg+ERwb3KAQG90cG9x+GT4TAPUMPhG8uBM+EJu4wDTH/hEWG91+GTR2zwhjhkj0NMB+kAwMcjPhyDOghDYNi2CzwuBzMlwji74RCBvEyFvEvhJVQJvEcjPhIDKAM+EQM4B+gL0AIBqz0D4RG8VzwsfzMn4RG8U4vsA4wDyADUNMwAg+ERwb3KAQG90cG9x+GT4TgPyMPhG8uBM+EJu4wDTH/hEWG91+GQhk9TR0N7T/9HbPCGOHSPQ0wH6QDAxyM+HIM5xzwthAcjPk0nnncLOzclwjjH4RCBvEyFvEvhJVQJvEcjPhIDKAM+EQM4B+gL0AHHPC2kByPhEbxXPCx/Ozcn4RG8U4vsA4wDyADUPMwEg+ERwb3KAQG90cG9x+GTbPBACMvgo2zwB2zz5APgo+kJvEsjPhkDKB8v/ydAiEQBIcMjL/3BtgED0QwHIy/9xWIBA9EPI9ADJAcjPhID0APQAz4HJA+Iw+Eby4Ez4Qm7jANMf+ERYb3X4ZNHbPCGOHSPQ0wH6QDAxyM+HIM5xzwthAcjPkuNt4hrOzclwjjH4RCBvEyFvEvhJVQJvEcjPhIDKAM+EQM4B+gL0AHHPC2kByPhEbxXPCx/Ozcn4RG8U4vsA4wDyADUTMwJM2zz4KNs8+QD4KPpCbxLIz4ZAygfL/8nQ+ERwb3KAQG90cG9x+GQpKARQIIIQFu37WbrjAiCCEC7exju64wIgghAyBOwpuuMCIIIQNHPXXLrjAhsZFxUD3jD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4aI9DTAfpAMDHIz4cgzoIQtHPXXM8Lgcv/yXCOMvhEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAcc8LaQHI+ERvFc8LH8v/zcn4RG8U4vsA4wDyADUWMwEk+ERwb3KAQG90cG9x+GTbPPkAKQPcMPhG8uBM+EJu4wDTH/hEWG91+GTTH9HbPCGOGiPQ0wH6QDAxyM+HIM6CELIE7CnPC4HKAMlwji/4RCBvEyFvEvhJVQJvEcjPhIDKAM+EQM4B+gL0AIBqz0D4RG8VzwsfygDJ+ERvFOL7AOMA8gA1GDMANvhEcG9ygEBvdHBvcfhk+EqAIPQOb5GT1woA3gPeMPhG8uBM+EJu4wDTH/hEWG91+GTR2zwhjhoj0NMB+kAwMcjPhyDOghCu3sY7zwuBy//JcI4y+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ABxzwtpAcj4RG8Vzwsfy//NyfhEbxTi+wDjAPIANRozASj4RHBvcoBAb3Rwb3H4ZPgo2zz5ACID1DD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4ZI9DTAfpAMDHIz4cgzoIQlu37Wc8LgczJcI4u+EQgbxMhbxL4SVUCbxHIz4SAygDPhEDOAfoC9ACAas9A+ERvFc8LH8zJ+ERvFOL7AOMA8gA1HDMAIPhEcG9ygEBvdHBvcfhk+EsETiCCC9WeZbrjAiCCEAQpjGO64wIgghAPr4uEuuMCIIIQFMynxrrjAjIjIB4D3jD4RvLgTPhCbuMA0x/4RFhvdfhk0ds8IY4aI9DTAfpAMDHIz4cgzoIQlMynxs8Lgcv/yXCOMvhEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAcc8LaQHI+ERvFc8LH8v/zcn4RG8U4vsA4wDyADUfMwAk+ERwb3KAQG90cG9x+GT4TfkAA9Qw+Eby4Ez4Qm7jANMf+ERYb3X4ZNHbPCGOGSPQ0wH6QDAxyM+HIM6CEI+vi4TPC4HMyXCOLvhEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAgGrPQPhEbxXPCx/MyfhEbxTi+wDjAPIANSEzAST4RHBvcoBAb3Rwb3H4ZPgo2zwiARLIzvhL0AHJ2zwqA/4w+EJu4wD4RvJz1NTU0Vj4APhrghAyBOwp+ErIz4NZgCD0QyD4aoIQYR8AZIIQD6+LhLKCEC7exjuyghBSeedwsgHIz4NZgCD0Q/hqIfkAiPkAvfLgZ/gAAfht+G74SoIQWDYtgoIQNHPXXLKCC9WeZbKCEBTMp8ayghA423iGMDkkAiiyAcjPg1mAIPRD+GrbPPgA2zzyACYlAF74UvhR+FD4T/hO+E34TPhL+Er4Q/hCyMv/yz/Pg/QAzMt/zMzLf8t/y3/Lf8ntVASK+E75AIj5AL3y4Gf4J28Q+FG88uBk2zz4KNs8IPkAyM+KAEDL/8nQAfhRWMjPhYjOAfoCc88LaiHbPMzPkNFqvn/JcPsAOSkoJwA00NIAAZPSBDHe0gABk9IBMd70BPQE9ATRXwMAQnDIy/9wbYBA9EMBcViAQPQWyPQAyQHIz4SA9AD0AM+ByQIUiMjM+E7QAcnbPC8qAhYhizits1jHBYqK4iwrAQgB2zzJLQEmAdTUMBLQ2zzIz44rbNYSzM8RyS0BZtWLL0pA1yb0BNMJMSDXSpHUjoDiiy9KGNcmMAHIz4vSkPQAgCDPCwnPi9KGzBLMyM8Rzi4BBIgBOQAGbmZ0AhbtRNDXScIBjoDjDTE1Apxw7UTQ9AVtiHCIIHBfMPhy+HH4cPhv+G74bfhs+Gv4aoBA9A7yvdcL//hicPhjghAI8NGA+G+CEAX14QD4cIIQCPDRgPhxghAR4aMA+HI5OQPUMPhG8uBM+EJu4wDTH/hEWG91+GTR2zwhjhkj0NMB+kAwMcjPhyDOghCD1Z5lzwuBzMlwji74RCBvEyFvEvhJVQJvEcjPhIDKAM+EQM4B+gL0AIBqz0D4RG8VzwsfzMn4RG8U4vsA4wDyADU0MwAo7UTQ0//TPzH4Q1jIy//LP87J7VQAIPhEcG9ygEBvdHBvcfhk+E0AYO1E0NP/0z/TADH0BNTTf9TU03/Tf9N/03/R+HL4cfhw+G/4bvht+Gz4a/hq+GP4YgAK+Eby4EwCCvSkIPShOTgAFHNvbCAwLjYxLjIAAA==
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/test/build/TIP4_3CollectionCon.tvc b/test/build/TIP4_3CollectionCon.tvc
index b94d475..de6cb7c 100644
Binary files a/test/build/TIP4_3CollectionCon.tvc and b/test/build/TIP4_3CollectionCon.tvc differ
diff --git a/test/build/TIP4_3NftCon.base64 b/test/build/TIP4_3NftCon.base64
index 0cf0d45..660c2e6 100644
--- a/test/build/TIP4_3NftCon.base64
+++ b/test/build/TIP4_3NftCon.base64
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/test/build/TIP4_3NftCon.tvc b/test/build/TIP4_3NftCon.tvc
index 246e083..e802a59 100644
Binary files a/test/build/TIP4_3NftCon.tvc and b/test/build/TIP4_3NftCon.tvc differ
diff --git a/test/build/TIP6Con.base64 b/test/build/TIP6Con.base64
index c97e28d..2597fcf 100644
--- a/test/build/TIP6Con.base64
+++ b/test/build/TIP6Con.base64
@@ -1 +1 @@
-te6ccgECEQEAAiEAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsOBQQQArbtRNDXScMB+GYh2zzTAAGOGYMI1xgg+QEB0wABlNP/AwGTAvhC4vkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8CAYDeu1E0NdJwwH4ZiLQ0wP6QDD4aak4APhEf29xggiYloBvcm1vc3BvdPhk3CHHAOMCIdcNH/K8IeMDAds88jwNDQYCKCCCEDIE7Cm64wIgghBotV8/uuMCCQcCRjD4Qm7jAPhG8nPR+ACCEDIE7Cn4SsjPg1mAIPRD+GrbPPIACAoBRO1E0NdJwgGOF3DtRND0BW34aoBA9A7yvdcL//hicPhj4w0MA9ww+Eby4Ez4Qm7jANMf+ERYb3X4ZNMf0ds8IY4aI9DTAfpAMDHIz4cgzoIQsgTsKc8LgcoAyXCOL/hEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAgGrPQPhEbxXPCx/KAMn4RG8U4vsA4wDyAAwLCgAk+Er4Q/hCyMv/yz/Pg/QAye1UADb4RHBvcoBAb3Rwb3H4ZPhKgCD0Dm+Rk9cKAN4AJu1E0NP/0z/TADH0BNH4avhj+GIACvhG8uBMAgr0pCD0oRAPABRzb2wgMC42MS4yAAA=
\ No newline at end of file
+te6ccgECEQEAAiEAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsOBQQQArbtRNDXScMB+GYh2zzTAAGOGYMI1xgg+QEB0wABlNP/AwGTAvhC4vkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8CAYDeu1E0NdJwwH4ZiLQ0wP6QDD4aak4APhEf29xggiYloBvcm1vc3BvdPhk3CHHAOMCIdcNH/K8IeMDAds88jwNDQYCKCCCEDIE7Cm64wIgghBotV8/uuMCCQcCRjD4Qm7jAPhG8nPR+ACCEDIE7Cn4SsjPg1mAIPRD+GrbPPIACAoBRO1E0NdJwgGOF3DtRND0BW34aoBA9A7yvdcL//hicPhj4w0MA9ww+Eby4Ez4Qm7jANMf+ERYb3X4ZNMf0ds8IY4aI9DTAfpAMDHIz4cgzoIQsgTsKc8LgcoAyXCOL/hEIG8TIW8S+ElVAm8RyM+EgMoAz4RAzgH6AvQAgGrPQPhEbxXPCx/KAMn4RG8U4vsA4wDyAAwLCgAk+Er4Q/hCyMv/yz/Pg/QAye1UADb4RHBvcoBAb3Rwb3H4ZPhKgCD0Dm+Rk9cKAN4AJu1E0NP/0z/TADH0BNH4avhj+GIACvhG8uBMAgr0pCD0oRAPABRzb2wgMC42Mi4wAAA=
\ No newline at end of file
diff --git a/test/build/TIP6Con.tvc b/test/build/TIP6Con.tvc
index 6578a07..832b13b 100644
Binary files a/test/build/TIP6Con.tvc and b/test/build/TIP6Con.tvc differ
diff --git a/test/build/Wallet.base64 b/test/build/Wallet.base64
index 409c702..f2be0b1 100644
--- a/test/build/Wallet.base64
+++ b/test/build/Wallet.base64
@@ -1 +1 @@
-te6ccgECFQEAAnIAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsSBQQUArztRNDXScMB+GYh2zzTAAGOHIMI1xgg+QEB0wABlNP/AwGTAvhC4iD4ZfkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8CgYDSu1E0NdJwwH4ZiLQ1wsDqTgA3CHHAOMCIdcNH/K8IeMDAds88jwREQYEUCCCEBF46b264wIgghA7UzMfuuMCIIIQTO5kbLrjAiCCEGi1Xz+64wIPDgsHA1Iw+EJu4wD4RvJz0fhFIG6SMHDe+EK68uH0+AD4RSBukjBw3ts82zzyAAoJCAAs+Ev4SvhD+ELIy//LP8+Dy//L/8ntVAAE+GoBYu1E0NdJwgGOJnDtRND0BXBxIoBA9A5vkZPXC//e+Gv4aoBA9A7yvdcL//hicPhj4w0QA0Iw+Eby4Ez4Qm7jACGT1NHQ3vpA03/SANMH1NHbPOMA8gAQDQwAKO1E0NP/0z8x+ENYyMv/yz/Oye1UAFT4RSBukjBw3vhKuvLh9fgAVQJVEsjPhYDKAM+EQM4B+gJxzwtqzMkB+wABUDDR2zz4SyGOHI0EcAAAAAAAAAAAAAAAAC7UzMfgyM7L/8lw+wDe8gAQAVAw0ds8+EohjhyNBHAAAAAAAAAAAAAAAAAkXjpvYMjOy//JcPsA3vIAEAAu7UTQ0//TP9MAMdP/0//R+Gv4avhj+GIACvhG8uBMAgr0pCD0oRQTABRzb2wgMC42MS4yAAA=
\ No newline at end of file
+te6ccgECFQEAAnIAAgE0AwEBAcACAEPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBCSK7VMg4wMgwP/jAiDA/uMC8gsSBQQUArztRNDXScMB+GYh2zzTAAGOHIMI1xgg+QEB0wABlNP/AwGTAvhC4iD4ZfkQ8qiV0wAB8nri0z8B+EMhufK0IPgjgQPoqIIIG3dAoLnytPhj0x8B+CO88rnTHwHbPPI8CgYDSu1E0NdJwwH4ZiLQ1wsDqTgA3CHHAOMCIdcNH/K8IeMDAds88jwREQYEUCCCEBF46b264wIgghA7UzMfuuMCIIIQTO5kbLrjAiCCEGi1Xz+64wIPDgsHA1Iw+EJu4wD4RvJz0fhFIG6SMHDe+EK68uH0+AD4RSBukjBw3ts82zzyAAoJCAAs+Ev4SvhD+ELIy//LP8+Dy//L/8ntVAAE+GoBYu1E0NdJwgGOJnDtRND0BXBxIoBA9A5vkZPXC//e+Gv4aoBA9A7yvdcL//hicPhj4w0QA0Iw+Eby4Ez4Qm7jACGT1NHQ3vpA03/SANMH1NHbPOMA8gAQDQwAKO1E0NP/0z8x+ENYyMv/yz/Oye1UAFT4RSBukjBw3vhKuvLh9fgAVQJVEsjPhYDKAM+EQM4B+gJxzwtqzMkB+wABUDDR2zz4SyGOHI0EcAAAAAAAAAAAAAAAAC7UzMfgyM7L/8lw+wDe8gAQAVAw0ds8+EohjhyNBHAAAAAAAAAAAAAAAAAkXjpvYMjOy//JcPsA3vIAEAAu7UTQ0//TP9MAMdP/0//R+Gv4avhj+GIACvhG8uBMAgr0pCD0oRQTABRzb2wgMC42Mi4wAAA=
\ No newline at end of file
diff --git a/test/build/Wallet.tvc b/test/build/Wallet.tvc
index 3f5dfee..f877c73 100644
Binary files a/test/build/Wallet.tvc and b/test/build/Wallet.tvc differ
diff --git a/test/build/factorySource.ts b/test/build/factorySource.ts
index 84df9ee..f274b71 100644
--- a/test/build/factorySource.ts
+++ b/test/build/factorySource.ts
@@ -1,7 +1,7 @@
const indexAbi = {"ABIversion":2,"version":"2.2","header":["time"],"functions":[{"name":"constructor","inputs":[{"name":"collection","type":"address"}],"outputs":[]},{"name":"getInfo","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"collection","type":"address"},{"name":"owner","type":"address"},{"name":"nft","type":"address"}]},{"name":"destruct","inputs":[{"name":"gasReceiver","type":"address"}],"outputs":[]}],"data":[{"key":1,"name":"_nft","type":"address"}],"events":[],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_nft","type":"address"},{"name":"_collection","type":"address"},{"name":"_owner","type":"address"}]} as const
const indexBasisAbi = {"ABIversion":2,"version":"2.2","header":["time"],"functions":[{"name":"constructor","inputs":[],"outputs":[]},{"name":"getInfo","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"collection","type":"address"}]},{"name":"destruct","inputs":[{"name":"gasReceiver","type":"address"}],"outputs":[]}],"data":[{"key":1,"name":"_collection","type":"address"}],"events":[],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_collection","type":"address"}]} as const
const ownableExternalContractAbi = {"ABIversion":2,"version":"2.2","header":["pubkey","time","expire"],"functions":[{"name":"constructor","inputs":[{"name":"owner","type":"uint256"}],"outputs":[]},{"name":"owner","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"pubkey","type":"uint256"}]},{"name":"transferOwnership","inputs":[{"name":"newOwner","type":"uint256"}],"outputs":[]}],"data":[{"key":1,"name":"_nonce","type":"uint16"}],"events":[{"name":"Test","inputs":[],"outputs":[]},{"name":"OwnershipTransferred","inputs":[{"name":"oldOwner","type":"uint256"},{"name":"newOwner","type":"uint256"}],"outputs":[]}],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_owner","type":"uint256"},{"name":"_nonce","type":"uint16"}]} as const
-const ownableInternalContractAbi = {"ABIversion":2,"version":"2.2","header":["pubkey","time","expire"],"functions":[{"name":"constructor","inputs":[{"name":"owner","type":"address"}],"outputs":[]},{"name":"owner","inputs":[],"outputs":[{"name":"owner","type":"address"}]},{"name":"transferOwnership","inputs":[{"name":"newOwner","type":"address"}],"outputs":[]}],"data":[{"key":1,"name":"_nonce","type":"uint16"}],"events":[{"name":"Test","inputs":[],"outputs":[]},{"name":"OwnershipTransferred","inputs":[{"name":"oldOwner","type":"address"},{"name":"newOwner","type":"address"}],"outputs":[]}],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_owner","type":"address"},{"name":"_nonce","type":"uint16"}]} as const
+const ownableInternalContractAbi = {"ABIversion":2,"version":"2.2","header":["pubkey","time","expire"],"functions":[{"name":"constructor","inputs":[{"name":"owner","type":"address"}],"outputs":[]},{"name":"owner","inputs":[],"outputs":[{"name":"owner_","type":"address"}]},{"name":"transferOwnership","inputs":[{"name":"newOwner","type":"address"}],"outputs":[]}],"data":[{"key":1,"name":"_nonce","type":"uint16"}],"events":[{"name":"Test","inputs":[],"outputs":[]},{"name":"OwnershipTransferred","inputs":[{"name":"oldOwner","type":"address"},{"name":"newOwner","type":"address"}],"outputs":[]}],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_owner","type":"address"},{"name":"_nonce","type":"uint16"}]} as const
const tIP4_1CollectionConAbi = {"ABIversion":2,"version":"2.2","header":["pubkey","time","expire"],"functions":[{"name":"constructor","inputs":[{"name":"codeNft","type":"cell"}],"outputs":[]},{"name":"mintNft","inputs":[{"name":"id","type":"uint128"},{"name":"owner","type":"address"}],"outputs":[{"name":"nftAddr","type":"address"}]},{"name":"nftCodeWithoutSalt","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"nftCode","type":"cell"}]},{"name":"totalSupply","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"count","type":"uint128"}]},{"name":"nftCode","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"code","type":"cell"}]},{"name":"nftCodeHash","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"codeHash","type":"uint256"}]},{"name":"nftAddress","inputs":[{"name":"answerId","type":"uint32"},{"name":"id","type":"uint256"}],"outputs":[{"name":"nft","type":"address"}]},{"name":"supportsInterface","inputs":[{"name":"answerId","type":"uint32"},{"name":"interfaceID","type":"uint32"}],"outputs":[{"name":"value0","type":"bool"}]}],"data":[],"events":[{"name":"NftCreated","inputs":[{"name":"id","type":"uint256"},{"name":"nft","type":"address"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"creator","type":"address"}],"outputs":[]},{"name":"NftBurned","inputs":[{"name":"id","type":"uint256"},{"name":"nft","type":"address"},{"name":"owner","type":"address"},{"name":"manager","type":"address"}],"outputs":[]}],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_supportedInterfaces","type":"optional(cell)"},{"name":"_codeNft","type":"cell"},{"name":"_totalSupply","type":"uint128"}]} as const
const tIP4_1NftConAbi = {"ABIversion":2,"version":"2.2","header":["pubkey","time","expire"],"functions":[{"name":"constructor","inputs":[{"name":"owner","type":"address"},{"name":"sendGasTo","type":"address"},{"name":"remainOnNft","type":"uint128"}],"outputs":[]},{"name":"transfer","inputs":[{"name":"to","type":"address"},{"name":"sendGasTo","type":"address"},{"components":[{"name":"value","type":"uint128"},{"name":"payload","type":"cell"}],"name":"callbacks","type":"map(address,tuple)"}],"outputs":[]},{"name":"changeOwner","inputs":[{"name":"newOwner","type":"address"},{"name":"sendGasTo","type":"address"},{"components":[{"name":"value","type":"uint128"},{"name":"payload","type":"cell"}],"name":"callbacks","type":"map(address,tuple)"}],"outputs":[]},{"name":"changeManager","inputs":[{"name":"newManager","type":"address"},{"name":"sendGasTo","type":"address"},{"components":[{"name":"value","type":"uint128"},{"name":"payload","type":"cell"}],"name":"callbacks","type":"map(address,tuple)"}],"outputs":[]},{"name":"getInfo","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"id","type":"uint256"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"collection","type":"address"}]},{"name":"supportsInterface","inputs":[{"name":"answerId","type":"uint32"},{"name":"interfaceID","type":"uint32"}],"outputs":[{"name":"value0","type":"bool"}]}],"data":[{"key":1,"name":"_id","type":"uint256"}],"events":[{"name":"NftCreated","inputs":[{"name":"id","type":"uint256"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"collection","type":"address"}],"outputs":[]},{"name":"OwnerChanged","inputs":[{"name":"oldOwner","type":"address"},{"name":"newOwner","type":"address"}],"outputs":[]},{"name":"ManagerChanged","inputs":[{"name":"oldManager","type":"address"},{"name":"newManager","type":"address"}],"outputs":[]},{"name":"NftBurned","inputs":[{"name":"id","type":"uint256"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"collection","type":"address"}],"outputs":[]}],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_supportedInterfaces","type":"optional(cell)"},{"name":"_id","type":"uint256"},{"name":"_collection","type":"address"},{"name":"_owner","type":"address"},{"name":"_manager","type":"address"}]} as const
const tIP4_2CollectionConAbi = {"ABIversion":2,"version":"2.2","header":["pubkey","time","expire"],"functions":[{"name":"constructor","inputs":[{"name":"codeNft","type":"cell"},{"name":"json","type":"string"}],"outputs":[]},{"name":"mintNft","inputs":[{"name":"id","type":"uint128"},{"name":"owner","type":"address"},{"name":"json","type":"string"}],"outputs":[]},{"name":"nftCodeWithoutSalt","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"nftCode","type":"cell"}]},{"name":"getJson","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"json","type":"string"}]},{"name":"totalSupply","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"count","type":"uint128"}]},{"name":"nftCode","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"code","type":"cell"}]},{"name":"nftCodeHash","inputs":[{"name":"answerId","type":"uint32"}],"outputs":[{"name":"codeHash","type":"uint256"}]},{"name":"nftAddress","inputs":[{"name":"answerId","type":"uint32"},{"name":"id","type":"uint256"}],"outputs":[{"name":"nft","type":"address"}]},{"name":"supportsInterface","inputs":[{"name":"answerId","type":"uint32"},{"name":"interfaceID","type":"uint32"}],"outputs":[{"name":"value0","type":"bool"}]}],"data":[],"events":[{"name":"NftCreated","inputs":[{"name":"id","type":"uint256"},{"name":"nft","type":"address"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"creator","type":"address"}],"outputs":[]},{"name":"NftBurned","inputs":[{"name":"id","type":"uint256"},{"name":"nft","type":"address"},{"name":"owner","type":"address"},{"name":"manager","type":"address"}],"outputs":[]}],"fields":[{"name":"_pubkey","type":"uint256"},{"name":"_timestamp","type":"uint64"},{"name":"_constructorFlag","type":"bool"},{"name":"_supportedInterfaces","type":"optional(cell)"},{"name":"_codeNft","type":"cell"},{"name":"_totalSupply","type":"uint128"},{"name":"_json","type":"string"}]} as const
diff --git a/test/contracts/TIP4_1/TIP4_1CollectionCon.sol b/test/contracts/TIP4_1/TIP4_1CollectionCon.tsol
similarity index 93%
rename from test/contracts/TIP4_1/TIP4_1CollectionCon.sol
rename to test/contracts/TIP4_1/TIP4_1CollectionCon.tsol
index 8de1375..9c2595a 100644
--- a/test/contracts/TIP4_1/TIP4_1CollectionCon.sol
+++ b/test/contracts/TIP4_1/TIP4_1CollectionCon.tsol
@@ -5,8 +5,8 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP4_1/TIP4_1Collection.sol";
-import "./TIP4_1NftCon.sol";
+import "../../../contracts/TIP4_1/TIP4_1Collection.tsol";
+import "./TIP4_1NftCon.tsol";
contract TIP4_1CollectionCon is TIP4_1Collection {
diff --git a/test/contracts/TIP4_1/TIP4_1NftCon.sol b/test/contracts/TIP4_1/TIP4_1NftCon.tsol
similarity index 87%
rename from test/contracts/TIP4_1/TIP4_1NftCon.sol
rename to test/contracts/TIP4_1/TIP4_1NftCon.tsol
index e1ff292..89951cb 100644
--- a/test/contracts/TIP4_1/TIP4_1NftCon.sol
+++ b/test/contracts/TIP4_1/TIP4_1NftCon.tsol
@@ -4,7 +4,7 @@ pragma AbiHeader expire;
pragma AbiHeader time;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP4_1/TIP4_1Nft.sol";
+import "../../../contracts/TIP4_1/TIP4_1Nft.tsol";
contract TIP4_1NftCon is TIP4_1Nft {
diff --git a/test/contracts/TIP4_2/TIP4_2CollectionCon.sol b/test/contracts/TIP4_2/TIP4_2CollectionCon.tsol
similarity index 90%
rename from test/contracts/TIP4_2/TIP4_2CollectionCon.sol
rename to test/contracts/TIP4_2/TIP4_2CollectionCon.tsol
index daf5fd3..590415d 100644
--- a/test/contracts/TIP4_2/TIP4_2CollectionCon.sol
+++ b/test/contracts/TIP4_2/TIP4_2CollectionCon.tsol
@@ -5,8 +5,8 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP4_2/TIP4_2Collection.sol";
-import "./TIP4_2NftCon.sol";
+import "../../../contracts/TIP4_2/TIP4_2Collection.tsol";
+import "./TIP4_2NftCon.tsol";
contract Collection is TIP4_2Collection {
@@ -33,7 +33,7 @@ contract Collection is TIP4_2Collection {
TvmCell codeNft = _buildNftCode(address(this));
TvmCell stateNft = _buildNftState(codeNft, uint256(id));
- address nftAddr = new TIP4_2NftCon{
+ new TIP4_2NftCon{
stateInit: stateNft,
value: 0.2 ever,
flag: 1
diff --git a/test/contracts/TIP4_2/TIP4_2NftCon.sol b/test/contracts/TIP4_2/TIP4_2NftCon.tsol
similarity index 80%
rename from test/contracts/TIP4_2/TIP4_2NftCon.sol
rename to test/contracts/TIP4_2/TIP4_2NftCon.tsol
index 442351a..0c9a5e2 100644
--- a/test/contracts/TIP4_2/TIP4_2NftCon.sol
+++ b/test/contracts/TIP4_2/TIP4_2NftCon.tsol
@@ -5,8 +5,8 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP4_1/TIP4_1Nft.sol";
-import "../../../contracts/TIP4_2/TIP4_2Nft.sol";
+import "../../../contracts/TIP4_1/TIP4_1Nft.tsol";
+import "../../../contracts/TIP4_2/TIP4_2Nft.tsol";
contract TIP4_2NftCon is TIP4_1Nft, TIP4_2Nft {
diff --git a/test/contracts/TIP4_3/TIP4_3CollectionCon.sol b/test/contracts/TIP4_3/TIP4_3CollectionCon.tsol
similarity index 92%
rename from test/contracts/TIP4_3/TIP4_3CollectionCon.sol
rename to test/contracts/TIP4_3/TIP4_3CollectionCon.tsol
index 4a16a5e..247241f 100644
--- a/test/contracts/TIP4_3/TIP4_3CollectionCon.sol
+++ b/test/contracts/TIP4_3/TIP4_3CollectionCon.tsol
@@ -5,8 +5,8 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP4_3/TIP4_3Collection.sol";
-import './TIP4_3NftCon.sol';
+import "../../../contracts/TIP4_3/TIP4_3Collection.tsol";
+import './TIP4_3NftCon.tsol';
contract Collection is TIP4_3Collection {
@@ -38,7 +38,7 @@ contract Collection is TIP4_3Collection {
TvmCell codeNft = _buildNftCode(address(this));
TvmCell stateNft = _buildNftState(codeNft, uint256(id));
- address nftAddr = new TIP4_3NftCon{
+ new TIP4_3NftCon{
stateInit: stateNft,
value: 0.7 ever,
flag: 1
diff --git a/test/contracts/TIP4_3/TIP4_3NftCon.sol b/test/contracts/TIP4_3/TIP4_3NftCon.tsol
similarity index 94%
rename from test/contracts/TIP4_3/TIP4_3NftCon.sol
rename to test/contracts/TIP4_3/TIP4_3NftCon.tsol
index b1a7c2f..c410e68 100644
--- a/test/contracts/TIP4_3/TIP4_3NftCon.sol
+++ b/test/contracts/TIP4_3/TIP4_3NftCon.tsol
@@ -5,8 +5,8 @@ pragma AbiHeader time;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP4_1/TIP4_1Nft.sol";
-import "../../../contracts/TIP4_3/TIP4_3Nft.sol";
+import "../../../contracts/TIP4_1/TIP4_1Nft.tsol";
+import "../../../contracts/TIP4_3/TIP4_3Nft.tsol";
contract TIP4_3NftCon is TIP4_1Nft, TIP4_3Nft {
diff --git a/test/contracts/TIP6/TIP6Con.sol b/test/contracts/TIP6/TIP6Con.tsol
similarity index 85%
rename from test/contracts/TIP6/TIP6Con.sol
rename to test/contracts/TIP6/TIP6Con.tsol
index fa5b0ef..508b58f 100644
--- a/test/contracts/TIP6/TIP6Con.sol
+++ b/test/contracts/TIP6/TIP6Con.tsol
@@ -3,7 +3,7 @@ pragma AbiHeader expire;
pragma AbiHeader pubkey;
-import "../../../contracts/TIP6/TIP6.sol";
+import "../../../contracts/TIP6/TIP6.tsol";
contract TIP6Con is TIP6 {
diff --git a/test/contracts/Wallet.sol b/test/contracts/Wallet.tsol
similarity index 100%
rename from test/contracts/Wallet.sol
rename to test/contracts/Wallet.tsol
diff --git a/test/contracts/access/OwnableExternalContract.sol b/test/contracts/access/OwnableExternalContract.tsol
similarity index 83%
rename from test/contracts/access/OwnableExternalContract.sol
rename to test/contracts/access/OwnableExternalContract.tsol
index c79e678..e159ca8 100644
--- a/test/contracts/access/OwnableExternalContract.sol
+++ b/test/contracts/access/OwnableExternalContract.tsol
@@ -3,7 +3,7 @@ pragma AbiHeader expire;
pragma AbiHeader pubkey;
-import "../../../contracts/access/OwnableExternal.sol";
+import "../../../contracts/access/OwnableExternal.tsol";
contract OwnableExternalContract is OwnableExternal {
diff --git a/test/contracts/access/OwnableInternalContract.sol b/test/contracts/access/OwnableInternalContract.tsol
similarity index 83%
rename from test/contracts/access/OwnableInternalContract.sol
rename to test/contracts/access/OwnableInternalContract.tsol
index fe6fa7c..5dd153c 100644
--- a/test/contracts/access/OwnableInternalContract.sol
+++ b/test/contracts/access/OwnableInternalContract.tsol
@@ -3,7 +3,7 @@ pragma AbiHeader expire;
pragma AbiHeader pubkey;
-import "../../../contracts/access/OwnableInternal.sol";
+import "../../../contracts/access/OwnableInternal.tsol";
contract OwnableInternalContract is OwnableInternal {
diff --git a/test/giverSettings/index.ts b/test/giverSettings/index.ts
deleted file mode 100644
index 27a9b46..0000000
--- a/test/giverSettings/index.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-import { Address, Contract, Giver, ProviderRpcClient, Transaction } from "locklift";
-import { Ed25519KeyPair } from "everscale-standalone-client";
-
-// Reimplements this class if you need to use custom giver contract
-export class SimpleGiver implements Giver {
- public giverContract: Contract;
-
- constructor(ever: ProviderRpcClient, readonly keyPair: Ed25519KeyPair, address: string) {
- const giverAddr = new Address(address);
- this.giverContract = new ever.Contract(giverAbi, giverAddr);
- }
-
- public async sendTo(sendTo: Address, value: string): Promise<{ transaction: Transaction; output?: {} }> {
- return this.giverContract.methods
- .sendTransaction({
- value: value,
- dest: sendTo,
- bounce: false,
- })
- .sendExternal({ publicKey: this.keyPair.publicKey });
- }
-}
-
-const giverAbi = {
- "ABI version": 2,
- header: ["time", "expire"],
- functions: [
- {
- name: "upgrade",
- inputs: [{ name: "newcode", type: "cell" }],
- outputs: [],
- },
- {
- name: "sendTransaction",
- inputs: [
- { name: "dest", type: "address" },
- { name: "value", type: "uint128" },
- { name: "bounce", type: "bool" },
- ],
- outputs: [],
- },
- {
- name: "getMessages",
- inputs: [],
- outputs: [
- {
- components: [
- { name: "hash", type: "uint256" },
- { name: "expireAt", type: "uint64" },
- ],
- name: "messages",
- type: "tuple[]",
- },
- ],
- },
- {
- name: "constructor",
- inputs: [],
- outputs: [],
- },
- ],
- events: [],
-} as const;
-
-export class GiverWallet implements Giver {
- public giverContract: Contract;
-
- constructor(ever: ProviderRpcClient, readonly keyPair: Ed25519KeyPair, address: string) {
- const giverAddr = new Address(address);
- this.giverContract = new ever.Contract(giverWallet, giverAddr);
- }
-
- public async sendTo(sendTo: Address, value: string): Promise<{ transaction: Transaction; output?: {} }> {
- return this.giverContract.methods
- .sendTransaction({
- value: value,
- dest: sendTo,
- bounce: false,
- flags: 3,
- payload: "",
- })
- .sendExternal({ publicKey: this.keyPair.publicKey });
- }
-}
-
-const giverWallet = {
- "ABI version": 2,
- header: ["pubkey", "time", "expire"],
- functions: [
- {
- name: "sendTransaction",
- inputs: [
- { name: "dest", type: "address" },
- { name: "value", type: "uint128" },
- { name: "bounce", type: "bool" },
- { name: "flags", type: "uint8" },
- { name: "payload", type: "cell" },
- ],
- outputs: [],
- },
- ],
- events: [],
-} as const;
-
-export class GiverWalletV2_3 implements Giver {
- public giverContract: Contract;
-
- constructor(ever: ProviderRpcClient, readonly keyPair: Ed25519KeyPair, address: string) {
- const giverAddr = new Address(address);
- this.giverContract = new ever.Contract(broxusEverWallet, giverAddr);
- }
-
- public async sendTo(sendTo: Address, value: string): Promise<{ transaction: Transaction; output?: {} }> {
- return this.giverContract.methods
- .sendTransaction({
- value: value,
- dest: sendTo,
- bounce: false,
- flags: 3,
- payload: "",
- })
- .sendExternal({ publicKey: this.keyPair.publicKey });
- }
-}
-
-const broxusEverWallet = {
- "ABI version": 2,
- version: "2.3",
- header: ["pubkey", "time", "expire"],
- functions: [
- {
- name: "sendTransaction",
- inputs: [
- { name: "dest", type: "address" },
- { name: "value", type: "uint128" },
- { name: "bounce", type: "bool" },
- { name: "flags", type: "uint8" },
- { name: "payload", type: "cell" },
- ],
- outputs: [],
- },
- ],
- events: [],
-} as const;
diff --git a/test/locklift.config.ts b/test/locklift.config.ts
index 388e6ce..04575d1 100644
--- a/test/locklift.config.ts
+++ b/test/locklift.config.ts
@@ -1,6 +1,9 @@
import { LockliftConfig } from "locklift";
import { FactorySource } from "./build/factorySource";
-import { SimpleGiver, GiverWalletV2_3 } from "./giverSettings";
+
+import { lockliftChai } from "locklift";
+import chai from "chai";
+chai.use(lockliftChai);
declare global {
const locklift: import("locklift").Locklift;
@@ -11,10 +14,10 @@ const RFLD_ENDPOINT = "https://rfld-dapp.itgold.io/graphql";
const config: LockliftConfig = {
compiler: {
- version: "0.61.2"
+ version: "0.62.0"
},
linker: {
- version: "0.14.51",
+ version: "0.15.48",
},
networks: {
local: {
@@ -28,7 +31,6 @@ const config: LockliftConfig = {
},
},
giver: {
- giverFactory: (ever, keyPair, address) => new SimpleGiver(ever, keyPair, address),
address: "0:ece57bcc6c530283becbbd8a3b24d3c5987cdddc3c8b7b33be6e4a6312490415",
key: "172af540e43a524763dd53b26a066d472a97c4de37d5498170564510608250c3",
},
@@ -36,6 +38,7 @@ const config: LockliftConfig = {
endpoint: LOCAL_NETWORK_ENDPOINT,
},
keys: {
+ phrase: "goat cousin cotton supreme tide recipe cause surface empower chaos try anxiety",
amount: 20,
},
},
@@ -50,7 +53,6 @@ const config: LockliftConfig = {
},
},
giver: {
- giverFactory: (ever, keyPair, address) => new GiverWalletV2_3(ever, keyPair, address),
address: "0:f2169a6b1f1b42e8b8dfb45d3d459eedbd15d601b701fd7f9e2992beae43736a",
key: "1cf6b8f2148058f70a3916768beb46e4f3d3a60597bef88181a544bc7cf00bcd",
},
diff --git a/test/test/ownable-internal-test.ts b/test/test/ownable-internal-test.ts
index 2a517f7..0a9ca69 100644
--- a/test/test/ownable-internal-test.ts
+++ b/test/test/ownable-internal-test.ts
@@ -91,7 +91,7 @@ describe("Test Ownable internal contract", async function () {
);
const response = await ownableInternal.methods.owner().call();
- expect(response.owner.toString()).to.be.equal(owner.address.toString());
+ expect(response.owner_.toString()).to.be.equal(owner.address.toString());
const pastEvents = await ownableInternal.getPastEvents({ filter: event => event.event === "OwnershipTransferred" });
expect(pastEvents.events.length).to.be.equal(1);
@@ -99,7 +99,7 @@ describe("Test Ownable internal contract", async function () {
it("Get owner test", async function () {
const response = await ownableInternal.methods.owner({}).call();
- expect(response.owner.toString()).to.be.equal(owner.address.toString());
+ expect(response.owner_.toString()).to.be.equal(owner.address.toString());
});
it("Transfer ownership test with zero new owner address", async function () {
@@ -126,7 +126,7 @@ describe("Test Ownable internal contract", async function () {
);
const response = await ownableInternal.methods.owner().call();
- expect(response.owner.toString()).to.be.equal(owner.address.toString());
+ expect(response.owner_.toString()).to.be.equal(owner.address.toString());
const pastEvents = await ownableInternal.getPastEvents({ filter: event => event.event === "OwnershipTransferred" });
expect(pastEvents.events.length).to.be.equal(1);
@@ -154,7 +154,7 @@ describe("Test Ownable internal contract", async function () {
);
const response = await ownableInternal.methods.owner({}).call();
- expect(response.owner.toString()).to.be.equal(newOwner.address.toString());
+ expect(response.owner_.toString()).to.be.equal(newOwner.address.toString());
const pastEvents = await ownableInternal.getPastEvents({ filter: event => event.event === "OwnershipTransferred" });
expect(pastEvents.events.length).to.be.equal(2);