@openzeppelin/wizard-stellar 0.4.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/add-pausable.d.ts +1 -1
- package/dist/add-pausable.d.ts.map +1 -1
- package/dist/add-pausable.js +8 -8
- package/dist/add-pausable.js.map +1 -1
- package/dist/add-upgradeable.d.ts +1 -1
- package/dist/add-upgradeable.d.ts.map +1 -1
- package/dist/add-upgradeable.js +2 -2
- package/dist/add-upgradeable.js.map +1 -1
- package/dist/common-options.d.ts +1 -0
- package/dist/common-options.d.ts.map +1 -1
- package/dist/common-options.js +2 -0
- package/dist/common-options.js.map +1 -1
- package/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +7 -0
- package/dist/contract.js.map +1 -1
- package/dist/fungible.d.ts.map +1 -1
- package/dist/fungible.js +38 -23
- package/dist/fungible.js.map +1 -1
- package/dist/generate/fungible.d.ts.map +1 -1
- package/dist/generate/fungible.js +1 -0
- package/dist/generate/fungible.js.map +1 -1
- package/dist/generate/non-fungible.d.ts.map +1 -1
- package/dist/generate/non-fungible.js +1 -0
- package/dist/generate/non-fungible.js.map +1 -1
- package/dist/generate/stablecoin.d.ts.map +1 -1
- package/dist/generate/stablecoin.js +1 -0
- package/dist/generate/stablecoin.js.map +1 -1
- package/dist/non-fungible.d.ts +1 -1
- package/dist/non-fungible.d.ts.map +1 -1
- package/dist/non-fungible.js +80 -41
- package/dist/non-fungible.js.map +1 -1
- package/dist/set-access-control.d.ts +2 -2
- package/dist/set-access-control.d.ts.map +1 -1
- package/dist/set-access-control.js +113 -10
- package/dist/set-access-control.js.map +1 -1
- package/dist/stablecoin.d.ts +2 -1
- package/dist/stablecoin.d.ts.map +1 -1
- package/dist/stablecoin.js +27 -6
- package/dist/stablecoin.js.map +1 -1
- package/dist/utils/compile-test.d.ts +1 -0
- package/dist/utils/compile-test.d.ts.map +1 -1
- package/dist/utils/compile-test.js +19 -5
- package/dist/utils/compile-test.js.map +1 -1
- package/dist/utils/version.d.ts +4 -4
- package/dist/utils/version.js +3 -3
- package/dist/zip-rust.d.ts.map +1 -1
- package/dist/zip-rust.js +4 -0
- package/dist/zip-rust.js.map +1 -1
- package/package.json +3 -3
- package/src/add-pausable.ts +29 -15
- package/src/add-upgradeable.ts +13 -6
- package/src/common-options.ts +3 -0
- package/src/contract.ts +9 -0
- package/src/fungible.ts +57 -29
- package/src/generate/fungible.ts +1 -0
- package/src/generate/non-fungible.ts +1 -0
- package/src/generate/stablecoin.ts +1 -0
- package/src/non-fungible.ts +121 -45
- package/src/set-access-control.ts +113 -9
- package/src/stablecoin.ts +39 -9
- package/src/utils/compile-test.ts +52 -25
- package/src/utils/version.ts +3 -3
- package/src/zip-rust.ts +5 -0
package/dist/stablecoin.js
CHANGED
|
@@ -4,11 +4,11 @@ exports.limitationsOptions = exports.defaults = void 0;
|
|
|
4
4
|
exports.printStablecoin = printStablecoin;
|
|
5
5
|
exports.isAccessControlRequired = isAccessControlRequired;
|
|
6
6
|
exports.buildStablecoin = buildStablecoin;
|
|
7
|
-
const define_functions_1 = require("./utils/define-functions");
|
|
8
7
|
const common_options_1 = require("./common-options");
|
|
9
|
-
const print_1 = require("./print");
|
|
10
8
|
const fungible_1 = require("./fungible");
|
|
9
|
+
const print_1 = require("./print");
|
|
11
10
|
const set_access_control_1 = require("./set-access-control");
|
|
11
|
+
const define_functions_1 = require("./utils/define-functions");
|
|
12
12
|
exports.defaults = {
|
|
13
13
|
...fungible_1.defaults,
|
|
14
14
|
name: 'MyStablecoin',
|
|
@@ -34,11 +34,11 @@ function buildStablecoin(opts) {
|
|
|
34
34
|
const allOpts = withDefaults(opts);
|
|
35
35
|
const c = (0, fungible_1.buildFungible)(allOpts);
|
|
36
36
|
if (allOpts.limitations) {
|
|
37
|
-
addLimitations(c, allOpts.access, allOpts.limitations);
|
|
37
|
+
addLimitations(c, allOpts.access, allOpts.limitations, allOpts.explicitImplementations);
|
|
38
38
|
}
|
|
39
39
|
return c;
|
|
40
40
|
}
|
|
41
|
-
function addLimitations(c, access, mode) {
|
|
41
|
+
function addLimitations(c, access, mode, explicitImplementations) {
|
|
42
42
|
const type = mode === 'allowlist';
|
|
43
43
|
const limitationsTrait = {
|
|
44
44
|
traitName: type ? 'FungibleAllowList' : 'FungibleBlockList',
|
|
@@ -54,6 +54,8 @@ function addLimitations(c, access, mode) {
|
|
|
54
54
|
c.addUseClause('stellar_tokens::fungible', 'blocklist::{BlockList, FungibleBlockList}');
|
|
55
55
|
c.overrideAssocType('FungibleToken', 'type ContractType = BlockList;');
|
|
56
56
|
}
|
|
57
|
+
if (explicitImplementations)
|
|
58
|
+
overrideFungibleReadonlyFunctionsWithBase(c);
|
|
57
59
|
const [getterFn, addFn, removeFn] = type
|
|
58
60
|
? [functions.allowed, functions.allow_user, functions.disallow_user]
|
|
59
61
|
: [functions.blocked, functions.block_user, functions.unblock_user];
|
|
@@ -64,9 +66,28 @@ function addLimitations(c, access, mode) {
|
|
|
64
66
|
caller: 'operator',
|
|
65
67
|
};
|
|
66
68
|
c.addTraitFunction(limitationsTrait, addFn);
|
|
67
|
-
(0, set_access_control_1.requireAccessControl)(c, limitationsTrait, addFn, access, accessProps);
|
|
69
|
+
(0, set_access_control_1.requireAccessControl)(c, limitationsTrait, addFn, access, accessProps, explicitImplementations);
|
|
68
70
|
c.addTraitFunction(limitationsTrait, removeFn);
|
|
69
|
-
(0, set_access_control_1.requireAccessControl)(c, limitationsTrait, removeFn, access, accessProps);
|
|
71
|
+
(0, set_access_control_1.requireAccessControl)(c, limitationsTrait, removeFn, access, accessProps, explicitImplementations);
|
|
72
|
+
}
|
|
73
|
+
function overrideFungibleReadonlyFunctionsWithBase(c) {
|
|
74
|
+
c.addUseClause('stellar_tokens::fungible', 'ContractOverrides');
|
|
75
|
+
const fungibleTokenTrait = {
|
|
76
|
+
traitName: 'FungibleToken',
|
|
77
|
+
structName: c.name,
|
|
78
|
+
tags: [],
|
|
79
|
+
};
|
|
80
|
+
const overrides = [
|
|
81
|
+
[fungible_1.functions.total_supply, ['Self::ContractType::total_supply(e)']],
|
|
82
|
+
[fungible_1.functions.balance, ['Self::ContractType::balance(e, &account)']],
|
|
83
|
+
[fungible_1.functions.allowance, ['Self::ContractType::allowance(e, &owner, &spender)']],
|
|
84
|
+
[fungible_1.functions.decimals, ['Self::ContractType::decimals(e)']],
|
|
85
|
+
[fungible_1.functions.name, ['Self::ContractType::name(e)']],
|
|
86
|
+
[fungible_1.functions.symbol, ['Self::ContractType::symbol(e)']],
|
|
87
|
+
];
|
|
88
|
+
for (const [fn, code] of overrides) {
|
|
89
|
+
c.setFunctionCode(fn, code, fungibleTokenTrait);
|
|
90
|
+
}
|
|
70
91
|
}
|
|
71
92
|
const functions = {
|
|
72
93
|
...fungible_1.functions,
|
package/dist/stablecoin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stablecoin.js","sourceRoot":"","sources":["../src/stablecoin.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"stablecoin.js","sourceRoot":"","sources":["../src/stablecoin.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export type MakeContract = (opt: GenericOptions) => Contract;
|
|
|
7
7
|
export declare const withTemporaryFolderDo: <Args extends unknown[]>(testFunction: WithTemporaryFolderTestFunction<Args>) => (...testFunctionArguments: Args) => (test: ExecutionContext) => Promise<void>;
|
|
8
8
|
export declare const runRustCompilationTest: (makeContract: MakeContract, opts: GenericOptions, testOptions: {
|
|
9
9
|
snapshotResult: boolean;
|
|
10
|
+
excludeExplicitTraitTest?: boolean;
|
|
10
11
|
}) => (test: ExecutionContext) => Promise<void>;
|
|
11
12
|
export {};
|
|
12
13
|
//# sourceMappingURL=compile-test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-test.d.ts","sourceRoot":"","sources":["../../src/utils/compile-test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile-test.d.ts","sourceRoot":"","sources":["../../src/utils/compile-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,eAAO,MAAM,YAAY,GAAU,GAAG,gBAAgB,EAAE,iBAAiB,MAAM,kBAI9E,CAAC;AAEF,KAAK,+BAA+B,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI,CAC7D,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,KACzC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,CAAC;AAE7D,eAAO,MAAM,qBAAqB,GAC/B,IAAI,SAAS,OAAO,EAAE,EAAE,cAAc,+BAA+B,CAAC,IAAI,CAAC,MAC3E,GAAG,uBAAuB,IAAI,MACxB,MAAM,gBAAgB,kBAO5B,CAAC;AAkCJ,eAAO,MAAM,sBAAsB;oBAIA,OAAO;+BAA6B,OAAO;OA7CrE,MAAM,gBAAgB,kBAkE9B,CAAC"}
|
|
@@ -4,14 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.runRustCompilationTest = exports.withTemporaryFolderDo = exports.runCargoTest = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
7
9
|
const os_1 = require("os");
|
|
8
10
|
const path_1 = __importDefault(require("path"));
|
|
9
11
|
const util_1 = require("util");
|
|
10
|
-
const child_process_1 = require("child_process");
|
|
11
|
-
const zip_test_1 = require("./zip-test");
|
|
12
|
-
const promises_1 = require("fs/promises");
|
|
13
|
-
const zip_shared_1 = require("../zip-shared");
|
|
14
12
|
const zip_rust_1 = require("../zip-rust");
|
|
13
|
+
const zip_shared_1 = require("../zip-shared");
|
|
14
|
+
const zip_test_1 = require("./zip-test");
|
|
15
15
|
const asyncExec = (0, util_1.promisify)(child_process_1.exec);
|
|
16
16
|
const runCargoTest = async (t, temporaryFolder) => {
|
|
17
17
|
const result = await asyncExec(`cd "${temporaryFolder}" && cargo test`);
|
|
@@ -28,8 +28,9 @@ const withTemporaryFolderDo = (testFunction) => (...testFunctionArguments) => as
|
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
exports.withTemporaryFolderDo = withTemporaryFolderDo;
|
|
31
|
-
|
|
31
|
+
const doRunRustCompilationTest = async (makeContract, opts, testOptions, test, folderPath) => {
|
|
32
32
|
test.timeout(3000000);
|
|
33
|
+
await (0, promises_1.mkdir)(folderPath, { recursive: true });
|
|
33
34
|
const scaffoldContractName = (0, zip_shared_1.contractOptionsToContractName)(opts?.kind || 'contract');
|
|
34
35
|
const expectedZipFiles = [
|
|
35
36
|
`contracts/${scaffoldContractName}/src/contract.rs`,
|
|
@@ -37,6 +38,7 @@ exports.runRustCompilationTest = (0, exports.withTemporaryFolderDo)(async (makeC
|
|
|
37
38
|
`contracts/${scaffoldContractName}/src/lib.rs`,
|
|
38
39
|
`contracts/${scaffoldContractName}/Cargo.toml`,
|
|
39
40
|
'Cargo.toml',
|
|
41
|
+
'.gitignore',
|
|
40
42
|
'README.md',
|
|
41
43
|
];
|
|
42
44
|
const zip = await (0, zip_rust_1.zipRustProject)(makeContract(opts), opts);
|
|
@@ -45,5 +47,17 @@ exports.runRustCompilationTest = (0, exports.withTemporaryFolderDo)(async (makeC
|
|
|
45
47
|
await (0, exports.runCargoTest)(test, folderPath);
|
|
46
48
|
if (testOptions.snapshotResult)
|
|
47
49
|
await (0, zip_test_1.snapshotZipContents)(test, zip, expectedZipFiles);
|
|
50
|
+
};
|
|
51
|
+
exports.runRustCompilationTest = (0, exports.withTemporaryFolderDo)(async (makeContract, opts, testOptions, test, folderPath) => {
|
|
52
|
+
await doRunRustCompilationTest(makeContract, opts, testOptions, test, `${folderPath}/default`);
|
|
53
|
+
const shouldBeExcludedOrHasAlreadyRun = testOptions.excludeExplicitTraitTest || opts.explicitImplementations;
|
|
54
|
+
if (shouldBeExcludedOrHasAlreadyRun)
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
await doRunRustCompilationTest(makeContract, { ...opts, explicitImplementations: true }, testOptions, test, `${folderPath}/explicit`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`EXPLICIT IMPLEMENTATION ERROR: ${error}`);
|
|
61
|
+
}
|
|
48
62
|
});
|
|
49
63
|
//# sourceMappingURL=compile-test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-test.js","sourceRoot":"","sources":["../../src/utils/compile-test.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"compile-test.js","sourceRoot":"","sources":["../../src/utils/compile-test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/version.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The actual latest version to use in links.
|
|
3
3
|
*/
|
|
4
|
-
export declare const contractsVersion = "0.
|
|
5
|
-
export declare const contractsVersionTag = "v0.
|
|
4
|
+
export declare const contractsVersion = "0.6.0";
|
|
5
|
+
export declare const contractsVersionTag = "v0.6.0";
|
|
6
6
|
/**
|
|
7
7
|
* Semantic version string representing of the minimum compatible version of Contracts to display in output.
|
|
8
8
|
*/
|
|
9
|
-
export declare const compatibleContractsSemver = "^0.
|
|
9
|
+
export declare const compatibleContractsSemver = "^0.6.0";
|
|
10
10
|
/**
|
|
11
11
|
* The Soroban version for which compilation and testing have passing tests
|
|
12
12
|
*/
|
|
13
|
-
export declare const compatibleSorobanVersion = "
|
|
13
|
+
export declare const compatibleSorobanVersion = "23.4.0";
|
|
14
14
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/utils/version.js
CHANGED
|
@@ -4,14 +4,14 @@ exports.compatibleSorobanVersion = exports.compatibleContractsSemver = exports.c
|
|
|
4
4
|
/**
|
|
5
5
|
* The actual latest version to use in links.
|
|
6
6
|
*/
|
|
7
|
-
exports.contractsVersion = '0.
|
|
7
|
+
exports.contractsVersion = '0.6.0';
|
|
8
8
|
exports.contractsVersionTag = `v${exports.contractsVersion}`;
|
|
9
9
|
/**
|
|
10
10
|
* Semantic version string representing of the minimum compatible version of Contracts to display in output.
|
|
11
11
|
*/
|
|
12
|
-
exports.compatibleContractsSemver = '^0.
|
|
12
|
+
exports.compatibleContractsSemver = '^0.6.0';
|
|
13
13
|
/**
|
|
14
14
|
* The Soroban version for which compilation and testing have passing tests
|
|
15
15
|
*/
|
|
16
|
-
exports.compatibleSorobanVersion = '
|
|
16
|
+
exports.compatibleSorobanVersion = '23.4.0';
|
|
17
17
|
//# sourceMappingURL=version.js.map
|
package/dist/zip-rust.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-rust.d.ts","sourceRoot":"","sources":["../src/zip-rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"zip-rust.d.ts","sourceRoot":"","sources":["../src/zip-rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6B3C,eAAO,MAAM,wBAAwB,GAAI,GAAG,QAAQ,EAAE,MAAM,cAAc,UAazE,CAAC;AAIF,eAAO,MAAM,cAAc,GAAU,GAAG,QAAQ,EAAE,MAAM,cAAc,mBACb,CAAC"}
|
package/dist/zip-rust.js
CHANGED
|
@@ -21,6 +21,9 @@ Continue your development journey with [Stellar CLI](https://github.com/stellar/
|
|
|
21
21
|
- See [Rust and Stellar installation guide](https://developers.stellar.org/docs/build/smart-contracts/getting-started/setup).
|
|
22
22
|
- See [Git installation guide](https://github.com/git-guides/install-git).
|
|
23
23
|
`;
|
|
24
|
+
const gitIgnore = `\
|
|
25
|
+
target/
|
|
26
|
+
`;
|
|
24
27
|
const createRustZipEnvironment = (c, opts) => {
|
|
25
28
|
const zip = new jszip_1.default();
|
|
26
29
|
const contractName = (0, zip_shared_1.contractOptionsToContractName)(opts?.kind || 'contract');
|
|
@@ -29,6 +32,7 @@ const createRustZipEnvironment = (c, opts) => {
|
|
|
29
32
|
zip.file(`contracts/${contractName}/src/lib.rs`, zip_shared_1.createRustLibFile);
|
|
30
33
|
zip.file(`contracts/${contractName}/Cargo.toml`, (0, zip_shared_1.printContractCargo)(contractName));
|
|
31
34
|
zip.file('Cargo.toml', zip_shared_1.workspaceCargo);
|
|
35
|
+
zip.file('.gitignore', gitIgnore);
|
|
32
36
|
return zip;
|
|
33
37
|
};
|
|
34
38
|
exports.createRustZipEnvironment = createRustZipEnvironment;
|
package/dist/zip-rust.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-rust.js","sourceRoot":"","sources":["../src/zip-rust.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,mCAAqE;AACrE,6CAMsB;AAEtB,MAAM,MAAM,GAAG;;;;;;;;;;;;;CAad,CAAC;AAEK,MAAM,wBAAwB,GAAG,CAAC,CAAW,EAAE,IAAoB,EAAE,EAAE;IAC5E,MAAM,GAAG,GAAG,IAAI,eAAK,EAAE,CAAC;IAExB,MAAM,YAAY,GAAG,IAAA,0CAA6B,EAAC,IAAI,EAAE,IAAI,IAAI,UAAU,CAAC,CAAC;IAE7E,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,kBAAkB,EAAE,IAAA,mCAA2B,EAAC,IAAA,qBAAa,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,cAAc,EAAE,IAAA,8BAAiB,EAAC,CAAC,CAAC,CAAC,CAAC;IACxE,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,aAAa,EAAE,8BAAiB,CAAC,CAAC;IACpE,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,aAAa,EAAE,IAAA,+BAAkB,EAAC,YAAY,CAAC,CAAC,CAAC;IACnF,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,2BAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"zip-rust.js","sourceRoot":"","sources":["../src/zip-rust.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,mCAAqE;AACrE,6CAMsB;AAEtB,MAAM,MAAM,GAAG;;;;;;;;;;;;;CAad,CAAC;AAEF,MAAM,SAAS,GAAG;;CAEjB,CAAC;AAEK,MAAM,wBAAwB,GAAG,CAAC,CAAW,EAAE,IAAoB,EAAE,EAAE;IAC5E,MAAM,GAAG,GAAG,IAAI,eAAK,EAAE,CAAC;IAExB,MAAM,YAAY,GAAG,IAAA,0CAA6B,EAAC,IAAI,EAAE,IAAI,IAAI,UAAU,CAAC,CAAC;IAE7E,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,kBAAkB,EAAE,IAAA,mCAA2B,EAAC,IAAA,qBAAa,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,cAAc,EAAE,IAAA,8BAAiB,EAAC,CAAC,CAAC,CAAC,CAAC;IACxE,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,aAAa,EAAE,8BAAiB,CAAC,CAAC;IACpE,GAAG,CAAC,IAAI,CAAC,aAAa,YAAY,aAAa,EAAE,IAAA,+BAAkB,EAAC,YAAY,CAAC,CAAC,CAAC;IACnF,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,2BAAc,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAElC,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAbW,QAAA,wBAAwB,4BAanC;AAEF,MAAM,oBAAoB,GAAG,CAAC,GAAU,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEpE,MAAM,cAAc,GAAG,KAAK,EAAE,CAAW,EAAE,IAAoB,EAAE,EAAE,CACxE,oBAAoB,CAAC,IAAA,gCAAwB,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAD7C,QAAA,cAAc,kBAC+B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openzeppelin/wizard-stellar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "A boilerplate generator to get started with OpenZeppelin Stellar Soroban Contracts",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"repository": "https://github.com/OpenZeppelin/contracts-wizard",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"@types/semver": "^7.5.7",
|
|
26
26
|
"ava": "^6.0.0",
|
|
27
27
|
"rimraf": "^5.0.0",
|
|
28
|
+
"semver": "^7.6.0",
|
|
28
29
|
"ts-node": "^10.4.0",
|
|
29
|
-
"typescript": "^5.0.0"
|
|
30
|
-
"semver": "^7.6.0"
|
|
30
|
+
"typescript": "^5.0.0"
|
|
31
31
|
}
|
|
32
32
|
}
|
package/src/add-pausable.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { getSelfArg } from './common-options';
|
|
2
2
|
import type { BaseFunction, ContractBuilder } from './contract';
|
|
3
3
|
import type { Access } from './set-access-control';
|
|
4
|
-
import { requireAccessControl } from './set-access-control';
|
|
4
|
+
import { DEFAULT_ACCESS_CONTROL, requireAccessControl } from './set-access-control';
|
|
5
5
|
import { defineFunctions } from './utils/define-functions';
|
|
6
6
|
|
|
7
|
-
export function addPausable(c: ContractBuilder, access: Access) {
|
|
7
|
+
export function addPausable(c: ContractBuilder, access: Access, explicitImplementations: boolean) {
|
|
8
8
|
c.addUseClause('stellar_contract_utils::pausable', 'self', { alias: 'pausable' });
|
|
9
9
|
c.addUseClause('stellar_contract_utils::pausable', 'Pausable');
|
|
10
|
-
c.addUseClause('stellar_macros', 'default_impl');
|
|
11
10
|
|
|
12
11
|
const pausableTrait = {
|
|
13
12
|
traitName: 'Pausable',
|
|
@@ -16,23 +15,38 @@ export function addPausable(c: ContractBuilder, access: Access) {
|
|
|
16
15
|
section: 'Utils',
|
|
17
16
|
};
|
|
18
17
|
|
|
19
|
-
const
|
|
20
|
-
const
|
|
18
|
+
const effectiveAccess = access === false ? DEFAULT_ACCESS_CONTROL : access;
|
|
19
|
+
const pauseFn: BaseFunction = effectiveAccess === 'ownable' ? functions.pause_unused_caller : functions.pause;
|
|
20
|
+
const unpauseFn: BaseFunction = effectiveAccess === 'ownable' ? functions.unpause_unused_caller : functions.unpause;
|
|
21
21
|
|
|
22
22
|
c.addTraitFunction(pausableTrait, functions.paused);
|
|
23
23
|
c.addTraitFunction(pausableTrait, pauseFn);
|
|
24
24
|
c.addTraitFunction(pausableTrait, unpauseFn);
|
|
25
|
-
requireAccessControl(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
requireAccessControl(
|
|
26
|
+
c,
|
|
27
|
+
pausableTrait,
|
|
28
|
+
pauseFn,
|
|
29
|
+
effectiveAccess,
|
|
30
|
+
{
|
|
31
|
+
useMacro: true,
|
|
32
|
+
role: 'pauser',
|
|
33
|
+
caller: 'caller',
|
|
34
|
+
},
|
|
35
|
+
explicitImplementations,
|
|
36
|
+
);
|
|
30
37
|
|
|
31
|
-
requireAccessControl(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
requireAccessControl(
|
|
39
|
+
c,
|
|
40
|
+
pausableTrait,
|
|
41
|
+
unpauseFn,
|
|
42
|
+
effectiveAccess,
|
|
43
|
+
{
|
|
44
|
+
useMacro: true,
|
|
45
|
+
role: 'pauser',
|
|
46
|
+
caller: 'caller',
|
|
47
|
+
},
|
|
48
|
+
explicitImplementations,
|
|
49
|
+
);
|
|
36
50
|
}
|
|
37
51
|
|
|
38
52
|
const functions = defineFunctions({
|
package/src/add-upgradeable.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { requireAccessControl } from './set-access-control';
|
|
|
4
4
|
import type { BaseFunction, ContractBuilder } from './contract';
|
|
5
5
|
import { defineFunctions } from './utils/define-functions';
|
|
6
6
|
|
|
7
|
-
export function addUpgradeable(c: ContractBuilder, access: Access) {
|
|
7
|
+
export function addUpgradeable(c: ContractBuilder, access: Access, explicitImplementations: boolean) {
|
|
8
8
|
const functions = defineFunctions({
|
|
9
9
|
_require_auth: {
|
|
10
10
|
args: [getSelfArg(), { name: 'operator', type: '&Address' }],
|
|
@@ -34,9 +34,16 @@ export function addUpgradeable(c: ContractBuilder, access: Access) {
|
|
|
34
34
|
|
|
35
35
|
c.addTraitFunction(upgradeableTrait, upgradeFn);
|
|
36
36
|
|
|
37
|
-
requireAccessControl(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
requireAccessControl(
|
|
38
|
+
c,
|
|
39
|
+
upgradeableTrait,
|
|
40
|
+
upgradeFn,
|
|
41
|
+
access,
|
|
42
|
+
{
|
|
43
|
+
useMacro: false,
|
|
44
|
+
role: 'upgrader',
|
|
45
|
+
caller: 'operator',
|
|
46
|
+
},
|
|
47
|
+
explicitImplementations,
|
|
48
|
+
);
|
|
42
49
|
}
|
package/src/common-options.ts
CHANGED
|
@@ -10,6 +10,7 @@ export const defaults: Required<CommonOptions> = {
|
|
|
10
10
|
export const contractDefaults: Required<CommonContractOptions> = {
|
|
11
11
|
...defaults,
|
|
12
12
|
access: false,
|
|
13
|
+
explicitImplementations: false,
|
|
13
14
|
} as const;
|
|
14
15
|
|
|
15
16
|
export interface CommonOptions {
|
|
@@ -18,6 +19,7 @@ export interface CommonOptions {
|
|
|
18
19
|
|
|
19
20
|
export interface CommonContractOptions extends CommonOptions {
|
|
20
21
|
access?: Access;
|
|
22
|
+
explicitImplementations?: boolean;
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
export function withCommonDefaults(opts: CommonOptions): Required<CommonOptions> {
|
|
@@ -30,6 +32,7 @@ export function withCommonContractDefaults(opts: CommonContractOptions): Require
|
|
|
30
32
|
return {
|
|
31
33
|
...withCommonDefaults(opts),
|
|
32
34
|
access: opts.access ?? contractDefaults.access,
|
|
35
|
+
explicitImplementations: opts.explicitImplementations ?? contractDefaults.explicitImplementations,
|
|
33
36
|
};
|
|
34
37
|
}
|
|
35
38
|
|
package/src/contract.ts
CHANGED
|
@@ -185,6 +185,10 @@ export class ContractBuilder implements Contract {
|
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
+
addTraitForEachFunctions(baseTrait: BaseTraitImplBlock, functions: Record<string, BaseFunction>) {
|
|
189
|
+
Object.values(functions).forEach(fn => this.addTraitFunction(baseTrait, fn));
|
|
190
|
+
}
|
|
191
|
+
|
|
188
192
|
// used for adding a function to a trait implementation block
|
|
189
193
|
addTraitFunction(baseTrait: BaseTraitImplBlock, fn: BaseFunction): ContractFunction {
|
|
190
194
|
const t = this.addTraitImplBlock(baseTrait);
|
|
@@ -241,6 +245,11 @@ export class ContractBuilder implements Contract {
|
|
|
241
245
|
existingFn.tags = [...(existingFn.tags ?? []), tag];
|
|
242
246
|
}
|
|
243
247
|
|
|
248
|
+
setFunctionCode(fn: BaseFunction, code: string[], baseTrait?: BaseTraitImplBlock): void {
|
|
249
|
+
const existingFn = this.getOrCreateFunction(fn, baseTrait);
|
|
250
|
+
existingFn.code = [...code];
|
|
251
|
+
}
|
|
252
|
+
|
|
244
253
|
addConstructorArgument(arg: Argument): void {
|
|
245
254
|
for (const existingArg of this.constructorArgs) {
|
|
246
255
|
if (existingArg.name == arg.name) {
|
package/src/fungible.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { OptionsError } from './error';
|
|
|
11
11
|
import { contractDefaults as commonDefaults } from './common-options';
|
|
12
12
|
import { printContract } from './print';
|
|
13
13
|
import { toByteArray, toUint } from './utils/convert-strings';
|
|
14
|
+
import { pickKeys } from '@openzeppelin/wizard-common';
|
|
14
15
|
|
|
15
16
|
export const defaults: Required<FungibleOptions> = {
|
|
16
17
|
name: 'MyToken',
|
|
@@ -22,6 +23,7 @@ export const defaults: Required<FungibleOptions> = {
|
|
|
22
23
|
mintable: false,
|
|
23
24
|
access: commonDefaults.access,
|
|
24
25
|
info: commonDefaults.info,
|
|
26
|
+
explicitImplementations: commonDefaults.explicitImplementations,
|
|
25
27
|
} as const;
|
|
26
28
|
|
|
27
29
|
export function printFungible(opts: FungibleOptions = defaults): string {
|
|
@@ -59,58 +61,68 @@ export function buildFungible(opts: FungibleOptions): ContractBuilder {
|
|
|
59
61
|
|
|
60
62
|
const allOpts = withDefaults(opts);
|
|
61
63
|
|
|
62
|
-
addBase(c, toByteArray(allOpts.name), toByteArray(allOpts.symbol), allOpts.pausable);
|
|
64
|
+
addBase(c, toByteArray(allOpts.name), toByteArray(allOpts.symbol), allOpts.pausable, allOpts.explicitImplementations);
|
|
63
65
|
|
|
64
66
|
if (allOpts.premint) {
|
|
65
67
|
addPremint(c, allOpts.premint);
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
if (allOpts.pausable) {
|
|
69
|
-
addPausable(c, allOpts.access);
|
|
71
|
+
addPausable(c, allOpts.access, allOpts.explicitImplementations);
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
if (allOpts.upgradeable) {
|
|
73
|
-
addUpgradeable(c, allOpts.access);
|
|
75
|
+
addUpgradeable(c, allOpts.access, allOpts.explicitImplementations);
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
if (allOpts.burnable) {
|
|
77
|
-
addBurnable(c, allOpts.pausable);
|
|
79
|
+
addBurnable(c, allOpts.pausable, allOpts.explicitImplementations);
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
if (allOpts.mintable) {
|
|
81
|
-
addMintable(c, allOpts.access, allOpts.pausable);
|
|
83
|
+
addMintable(c, allOpts.access, allOpts.pausable, allOpts.explicitImplementations);
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
setAccessControl(c, allOpts.access);
|
|
86
|
+
setAccessControl(c, allOpts.access, allOpts.explicitImplementations);
|
|
85
87
|
setInfo(c, allOpts.info);
|
|
86
88
|
|
|
87
89
|
return c;
|
|
88
90
|
}
|
|
89
91
|
|
|
90
|
-
function addBase(
|
|
92
|
+
function addBase(
|
|
93
|
+
c: ContractBuilder,
|
|
94
|
+
name: string,
|
|
95
|
+
symbol: string,
|
|
96
|
+
pausable: boolean,
|
|
97
|
+
explicitImplementations: boolean,
|
|
98
|
+
) {
|
|
91
99
|
// Set metadata
|
|
92
|
-
c.addConstructorCode(`Base::set_metadata(e,
|
|
100
|
+
c.addConstructorCode(`Base::set_metadata(e, 7, String::from_str(e, "${name}"), String::from_str(e, "${symbol}"));`);
|
|
93
101
|
|
|
94
102
|
// Set token functions
|
|
95
103
|
c.addUseClause('stellar_tokens::fungible', 'Base');
|
|
96
104
|
c.addUseClause('stellar_tokens::fungible', 'FungibleToken');
|
|
97
|
-
c.addUseClause('stellar_macros', 'default_impl');
|
|
98
105
|
c.addUseClause('soroban_sdk', 'contract');
|
|
99
106
|
c.addUseClause('soroban_sdk', 'contractimpl');
|
|
100
107
|
c.addUseClause('soroban_sdk', 'String');
|
|
108
|
+
c.addUseClause('soroban_sdk', 'Symbol');
|
|
101
109
|
c.addUseClause('soroban_sdk', 'Env');
|
|
110
|
+
c.addUseClause('soroban_sdk', 'Address');
|
|
111
|
+
c.addUseClause('soroban_sdk', 'MuxedAddress');
|
|
112
|
+
c.addUseClause('soroban_sdk', 'Vec');
|
|
102
113
|
|
|
103
114
|
const fungibleTokenTrait = {
|
|
104
115
|
traitName: 'FungibleToken',
|
|
105
116
|
structName: c.name,
|
|
106
|
-
tags: ['
|
|
117
|
+
tags: explicitImplementations ? ['contractimpl'] : ['contractimpl(contracttrait)'],
|
|
107
118
|
assocType: 'type ContractType = Base;',
|
|
108
119
|
};
|
|
109
120
|
|
|
110
121
|
c.addTraitImplBlock(fungibleTokenTrait);
|
|
111
122
|
|
|
123
|
+
if (explicitImplementations) c.addTraitForEachFunctions(fungibleTokenTrait, fungibleTokenTraitFunctions);
|
|
124
|
+
|
|
112
125
|
if (pausable) {
|
|
113
|
-
c.addUseClause('soroban_sdk', 'Address');
|
|
114
126
|
c.addUseClause('stellar_macros', 'when_not_paused');
|
|
115
127
|
|
|
116
128
|
c.addTraitFunction(fungibleTokenTrait, functions.transfer);
|
|
@@ -121,15 +133,14 @@ function addBase(c: ContractBuilder, name: string, symbol: string, pausable: boo
|
|
|
121
133
|
}
|
|
122
134
|
}
|
|
123
135
|
|
|
124
|
-
function addMintable(c: ContractBuilder, access: Access, pausable: boolean) {
|
|
125
|
-
c.addUseClause('soroban_sdk', 'Address');
|
|
136
|
+
function addMintable(c: ContractBuilder, access: Access, pausable: boolean, explicitImplementations: boolean) {
|
|
126
137
|
switch (access) {
|
|
127
138
|
case false:
|
|
128
139
|
break;
|
|
129
140
|
case 'ownable': {
|
|
130
141
|
c.addFreeFunction(functions.mint);
|
|
131
142
|
|
|
132
|
-
requireAccessControl(c, undefined, functions.mint, access);
|
|
143
|
+
requireAccessControl(c, undefined, functions.mint, access, undefined, explicitImplementations);
|
|
133
144
|
|
|
134
145
|
if (pausable) {
|
|
135
146
|
c.addFunctionTag(functions.mint, 'when_not_paused');
|
|
@@ -139,11 +150,18 @@ function addMintable(c: ContractBuilder, access: Access, pausable: boolean) {
|
|
|
139
150
|
case 'roles': {
|
|
140
151
|
c.addFreeFunction(functions.mint_with_caller);
|
|
141
152
|
|
|
142
|
-
requireAccessControl(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
153
|
+
requireAccessControl(
|
|
154
|
+
c,
|
|
155
|
+
undefined,
|
|
156
|
+
functions.mint_with_caller,
|
|
157
|
+
access,
|
|
158
|
+
{
|
|
159
|
+
useMacro: true,
|
|
160
|
+
caller: 'caller',
|
|
161
|
+
role: 'minter',
|
|
162
|
+
},
|
|
163
|
+
explicitImplementations,
|
|
164
|
+
);
|
|
147
165
|
|
|
148
166
|
if (pausable) {
|
|
149
167
|
c.addFunctionTag(functions.mint_with_caller, 'when_not_paused');
|
|
@@ -157,14 +175,13 @@ function addMintable(c: ContractBuilder, access: Access, pausable: boolean) {
|
|
|
157
175
|
}
|
|
158
176
|
}
|
|
159
177
|
|
|
160
|
-
function addBurnable(c: ContractBuilder, pausable: boolean) {
|
|
178
|
+
function addBurnable(c: ContractBuilder, pausable: boolean, explicitImplementations: boolean) {
|
|
161
179
|
c.addUseClause('stellar_tokens::fungible', 'burnable::FungibleBurnable');
|
|
162
|
-
c.addUseClause('soroban_sdk', 'Address');
|
|
163
180
|
|
|
164
181
|
const fungibleBurnableTrait = {
|
|
165
182
|
traitName: 'FungibleBurnable',
|
|
166
183
|
structName: c.name,
|
|
167
|
-
tags: ['contractimpl'],
|
|
184
|
+
tags: explicitImplementations ? ['contractimpl'] : ['contractimpl(contracttrait)'],
|
|
168
185
|
section: 'Extensions',
|
|
169
186
|
};
|
|
170
187
|
|
|
@@ -176,9 +193,8 @@ function addBurnable(c: ContractBuilder, pausable: boolean) {
|
|
|
176
193
|
|
|
177
194
|
c.addTraitFunction(fungibleBurnableTrait, functions.burn_from);
|
|
178
195
|
c.addFunctionTag(functions.burn_from, 'when_not_paused', fungibleBurnableTrait);
|
|
179
|
-
} else
|
|
180
|
-
|
|
181
|
-
fungibleBurnableTrait.tags.unshift('default_impl');
|
|
196
|
+
} else if (explicitImplementations) c.addTraitForEachFunctions(fungibleBurnableTrait, fungibleBurnableFunctions);
|
|
197
|
+
else {
|
|
182
198
|
c.addTraitImplBlock(fungibleBurnableTrait);
|
|
183
199
|
}
|
|
184
200
|
}
|
|
@@ -194,9 +210,7 @@ function addPremint(c: ContractBuilder, amount: string) {
|
|
|
194
210
|
}
|
|
195
211
|
|
|
196
212
|
// TODO: handle signed int?
|
|
197
|
-
const premintAbsolute = toUint(getInitialSupply(amount,
|
|
198
|
-
|
|
199
|
-
c.addUseClause('soroban_sdk', 'Address');
|
|
213
|
+
const premintAbsolute = toUint(getInitialSupply(amount, 7), 'premint', 'u128');
|
|
200
214
|
|
|
201
215
|
c.addConstructorArgument({ name: 'recipient', type: 'Address' });
|
|
202
216
|
c.addConstructorCode(`Base::mint(e, &recipient, ${premintAbsolute});`);
|
|
@@ -265,7 +279,7 @@ export const functions = defineFunctions({
|
|
|
265
279
|
args: [
|
|
266
280
|
getSelfArg(),
|
|
267
281
|
{ name: 'from', type: 'Address' },
|
|
268
|
-
{ name: 'to', type: '
|
|
282
|
+
{ name: 'to', type: 'MuxedAddress' },
|
|
269
283
|
{ name: 'amount', type: 'i128' },
|
|
270
284
|
],
|
|
271
285
|
code: ['Self::ContractType::transfer(e, &from, &to, amount)'],
|
|
@@ -335,3 +349,17 @@ export const functions = defineFunctions({
|
|
|
335
349
|
code: ['Base::mint(e, &account, amount);'],
|
|
336
350
|
},
|
|
337
351
|
});
|
|
352
|
+
|
|
353
|
+
const fungibleTokenTraitFunctions = pickKeys(functions, [
|
|
354
|
+
'total_supply',
|
|
355
|
+
'balance',
|
|
356
|
+
'allowance',
|
|
357
|
+
'transfer',
|
|
358
|
+
'transfer_from',
|
|
359
|
+
'approve',
|
|
360
|
+
'decimals',
|
|
361
|
+
'name',
|
|
362
|
+
'symbol',
|
|
363
|
+
]);
|
|
364
|
+
|
|
365
|
+
const fungibleBurnableFunctions = pickKeys(functions, ['burn', 'burn_from']);
|
package/src/generate/fungible.ts
CHANGED