@decaf-ts/for-fabric 0.0.2
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/LICENSE.md +22 -0
- package/README.md +647 -0
- package/dist/for-fabric.cjs +6223 -0
- package/dist/for-fabric.esm.cjs +6180 -0
- package/lib/client/FabricClientAdapter.cjs +760 -0
- package/lib/client/FabricClientAdapter.d.ts +381 -0
- package/lib/client/FabricClientDispatch.cjs +186 -0
- package/lib/client/FabricClientDispatch.d.ts +125 -0
- package/lib/client/FabricClientRepository.cjs +131 -0
- package/lib/client/FabricClientRepository.d.ts +100 -0
- package/lib/client/erc20/erc20ClientRepository.cjs +343 -0
- package/lib/client/erc20/erc20ClientRepository.d.ts +254 -0
- package/lib/client/fabric-fs.cjs +234 -0
- package/lib/client/fabric-fs.d.ts +92 -0
- package/lib/client/index.cjs +30 -0
- package/lib/client/index.d.ts +13 -0
- package/lib/client/logging.cjs +102 -0
- package/lib/client/logging.d.ts +60 -0
- package/lib/client/services/LoggedService.cjs +47 -0
- package/lib/client/services/LoggedService.d.ts +42 -0
- package/lib/client/services/constants.cjs +3 -0
- package/lib/client/services/constants.d.ts +15 -0
- package/lib/client/services/enrollementService.cjs +344 -0
- package/lib/client/services/enrollementService.d.ts +176 -0
- package/lib/client/services/index.cjs +18 -0
- package/lib/client/services/index.d.ts +1 -0
- package/lib/contracts/ContractAdapter.cjs +730 -0
- package/lib/contracts/ContractAdapter.d.ts +296 -0
- package/lib/contracts/ContractContext.cjs +85 -0
- package/lib/contracts/ContractContext.d.ts +64 -0
- package/lib/contracts/ContractPrivateDataAdapter.cjs +281 -0
- package/lib/contracts/ContractPrivateDataAdapter.d.ts +74 -0
- package/lib/contracts/FabricConstruction.cjs +441 -0
- package/lib/contracts/FabricConstruction.d.ts +304 -0
- package/lib/contracts/FabricContractRepository.cjs +306 -0
- package/lib/contracts/FabricContractRepository.d.ts +162 -0
- package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +85 -0
- package/lib/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
- package/lib/contracts/FabricContractSequence.cjs +139 -0
- package/lib/contracts/FabricContractSequence.d.ts +61 -0
- package/lib/contracts/FabricContractStatement.cjs +119 -0
- package/lib/contracts/FabricContractStatement.d.ts +34 -0
- package/lib/contracts/PrivateSequence.cjs +36 -0
- package/lib/contracts/PrivateSequence.d.ts +15 -0
- package/lib/contracts/crud/crud-contract.cjs +257 -0
- package/lib/contracts/crud/crud-contract.d.ts +168 -0
- package/lib/contracts/crud/index.cjs +19 -0
- package/lib/contracts/crud/index.d.ts +2 -0
- package/lib/contracts/crud/serialized-crud-contract.cjs +172 -0
- package/lib/contracts/crud/serialized-crud-contract.d.ts +37 -0
- package/lib/contracts/erc20/erc20contract.cjs +569 -0
- package/lib/contracts/erc20/erc20contract.d.ts +151 -0
- package/lib/contracts/erc20/index.cjs +21 -0
- package/lib/contracts/erc20/index.d.ts +2 -0
- package/lib/contracts/erc20/models.cjs +209 -0
- package/lib/contracts/erc20/models.d.ts +114 -0
- package/lib/contracts/index.cjs +32 -0
- package/lib/contracts/index.d.ts +15 -0
- package/lib/contracts/logging.cjs +96 -0
- package/lib/contracts/logging.d.ts +49 -0
- package/lib/contracts/private-data.cjs +121 -0
- package/lib/contracts/private-data.d.ts +16 -0
- package/lib/contracts/types.cjs +3 -0
- package/lib/contracts/types.d.ts +26 -0
- package/lib/esm/client/FabricClientAdapter.d.ts +381 -0
- package/lib/esm/client/FabricClientAdapter.js +723 -0
- package/lib/esm/client/FabricClientDispatch.d.ts +125 -0
- package/lib/esm/client/FabricClientDispatch.js +182 -0
- package/lib/esm/client/FabricClientRepository.d.ts +100 -0
- package/lib/esm/client/FabricClientRepository.js +127 -0
- package/lib/esm/client/erc20/erc20ClientRepository.d.ts +254 -0
- package/lib/esm/client/erc20/erc20ClientRepository.js +339 -0
- package/lib/esm/client/fabric-fs.d.ts +92 -0
- package/lib/esm/client/fabric-fs.js +191 -0
- package/lib/esm/client/index.d.ts +13 -0
- package/lib/esm/client/index.js +14 -0
- package/lib/esm/client/logging.d.ts +60 -0
- package/lib/esm/client/logging.js +98 -0
- package/lib/esm/client/services/LoggedService.d.ts +42 -0
- package/lib/esm/client/services/LoggedService.js +43 -0
- package/lib/esm/client/services/constants.d.ts +15 -0
- package/lib/esm/client/services/constants.js +2 -0
- package/lib/esm/client/services/enrollementService.d.ts +176 -0
- package/lib/esm/client/services/enrollementService.js +337 -0
- package/lib/esm/client/services/index.d.ts +1 -0
- package/lib/esm/client/services/index.js +2 -0
- package/lib/esm/contracts/ContractAdapter.d.ts +296 -0
- package/lib/esm/contracts/ContractAdapter.js +724 -0
- package/lib/esm/contracts/ContractContext.d.ts +64 -0
- package/lib/esm/contracts/ContractContext.js +81 -0
- package/lib/esm/contracts/ContractPrivateDataAdapter.d.ts +74 -0
- package/lib/esm/contracts/ContractPrivateDataAdapter.js +277 -0
- package/lib/esm/contracts/FabricConstruction.d.ts +304 -0
- package/lib/esm/contracts/FabricConstruction.js +433 -0
- package/lib/esm/contracts/FabricContractRepository.d.ts +162 -0
- package/lib/esm/contracts/FabricContractRepository.js +302 -0
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +81 -0
- package/lib/esm/contracts/FabricContractSequence.d.ts +61 -0
- package/lib/esm/contracts/FabricContractSequence.js +135 -0
- package/lib/esm/contracts/FabricContractStatement.d.ts +34 -0
- package/lib/esm/contracts/FabricContractStatement.js +115 -0
- package/lib/esm/contracts/PrivateSequence.d.ts +15 -0
- package/lib/esm/contracts/PrivateSequence.js +33 -0
- package/lib/esm/contracts/crud/crud-contract.d.ts +168 -0
- package/lib/esm/contracts/crud/crud-contract.js +253 -0
- package/lib/esm/contracts/crud/index.d.ts +2 -0
- package/lib/esm/contracts/crud/index.js +3 -0
- package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +37 -0
- package/lib/esm/contracts/crud/serialized-crud-contract.js +168 -0
- package/lib/esm/contracts/erc20/erc20contract.d.ts +151 -0
- package/lib/esm/contracts/erc20/erc20contract.js +565 -0
- package/lib/esm/contracts/erc20/index.d.ts +2 -0
- package/lib/esm/contracts/erc20/index.js +4 -0
- package/lib/esm/contracts/erc20/models.d.ts +114 -0
- package/lib/esm/contracts/erc20/models.js +206 -0
- package/lib/esm/contracts/index.d.ts +15 -0
- package/lib/esm/contracts/index.js +16 -0
- package/lib/esm/contracts/logging.d.ts +49 -0
- package/lib/esm/contracts/logging.js +92 -0
- package/lib/esm/contracts/private-data.d.ts +16 -0
- package/lib/esm/contracts/private-data.js +113 -0
- package/lib/esm/contracts/types.d.ts +26 -0
- package/lib/esm/contracts/types.js +2 -0
- package/lib/esm/index.d.ts +8 -0
- package/lib/esm/index.js +9 -0
- package/lib/esm/shared/ClientSerializer.d.ts +52 -0
- package/lib/esm/shared/ClientSerializer.js +80 -0
- package/lib/esm/shared/DeterministicSerializer.d.ts +40 -0
- package/lib/esm/shared/DeterministicSerializer.js +50 -0
- package/lib/esm/shared/SimpleDeterministicSerializer.d.ts +7 -0
- package/lib/esm/shared/SimpleDeterministicSerializer.js +42 -0
- package/lib/esm/shared/constants.d.ts +39 -0
- package/lib/esm/shared/constants.js +42 -0
- package/lib/esm/shared/crypto.d.ts +107 -0
- package/lib/esm/shared/crypto.js +331 -0
- package/lib/esm/shared/decorators.d.ts +24 -0
- package/lib/esm/shared/decorators.js +98 -0
- package/lib/esm/shared/erc20/erc20-constants.d.ts +25 -0
- package/lib/esm/shared/erc20/erc20-constants.js +27 -0
- package/lib/esm/shared/errors.d.ts +116 -0
- package/lib/esm/shared/errors.js +132 -0
- package/lib/esm/shared/events.d.ts +39 -0
- package/lib/esm/shared/events.js +47 -0
- package/lib/esm/shared/fabric-types.d.ts +33 -0
- package/lib/esm/shared/fabric-types.js +2 -0
- package/lib/esm/shared/index.d.ts +13 -0
- package/lib/esm/shared/index.js +14 -0
- package/lib/esm/shared/interfaces/Checkable.d.ts +21 -0
- package/lib/esm/shared/interfaces/Checkable.js +2 -0
- package/lib/esm/shared/math.d.ts +34 -0
- package/lib/esm/shared/math.js +61 -0
- package/lib/esm/shared/model/Identity.d.ts +42 -0
- package/lib/esm/shared/model/Identity.js +78 -0
- package/lib/esm/shared/model/IdentityCredentials.d.ts +41 -0
- package/lib/esm/shared/model/IdentityCredentials.js +74 -0
- package/lib/esm/shared/model/index.d.ts +1 -0
- package/lib/esm/shared/model/index.js +2 -0
- package/lib/esm/shared/model/utils.d.ts +60 -0
- package/lib/esm/shared/model/utils.js +108 -0
- package/lib/esm/shared/types.d.ts +79 -0
- package/lib/esm/shared/types.js +2 -0
- package/lib/esm/shared/utils.d.ts +55 -0
- package/lib/esm/shared/utils.js +148 -0
- package/lib/index.cjs +25 -0
- package/lib/index.d.ts +8 -0
- package/lib/shared/ClientSerializer.cjs +84 -0
- package/lib/shared/ClientSerializer.d.ts +52 -0
- package/lib/shared/DeterministicSerializer.cjs +54 -0
- package/lib/shared/DeterministicSerializer.d.ts +40 -0
- package/lib/shared/SimpleDeterministicSerializer.cjs +46 -0
- package/lib/shared/SimpleDeterministicSerializer.d.ts +7 -0
- package/lib/shared/constants.cjs +45 -0
- package/lib/shared/constants.d.ts +39 -0
- package/lib/shared/crypto.cjs +369 -0
- package/lib/shared/crypto.d.ts +107 -0
- package/lib/shared/decorators.cjs +105 -0
- package/lib/shared/decorators.d.ts +24 -0
- package/lib/shared/erc20/erc20-constants.cjs +30 -0
- package/lib/shared/erc20/erc20-constants.d.ts +25 -0
- package/lib/shared/errors.cjs +142 -0
- package/lib/shared/errors.d.ts +116 -0
- package/lib/shared/events.cjs +51 -0
- package/lib/shared/events.d.ts +39 -0
- package/lib/shared/fabric-types.cjs +4 -0
- package/lib/shared/fabric-types.d.ts +33 -0
- package/lib/shared/index.cjs +30 -0
- package/lib/shared/index.d.ts +13 -0
- package/lib/shared/interfaces/Checkable.cjs +3 -0
- package/lib/shared/interfaces/Checkable.d.ts +21 -0
- package/lib/shared/math.cjs +66 -0
- package/lib/shared/math.d.ts +34 -0
- package/lib/shared/model/Identity.cjs +81 -0
- package/lib/shared/model/Identity.d.ts +42 -0
- package/lib/shared/model/IdentityCredentials.cjs +77 -0
- package/lib/shared/model/IdentityCredentials.d.ts +41 -0
- package/lib/shared/model/index.cjs +18 -0
- package/lib/shared/model/index.d.ts +1 -0
- package/lib/shared/model/utils.cjs +114 -0
- package/lib/shared/model/utils.d.ts +60 -0
- package/lib/shared/types.cjs +3 -0
- package/lib/shared/types.d.ts +79 -0
- package/lib/shared/utils.cjs +185 -0
- package/lib/shared/utils.d.ts +55 -0
- package/package.json +166 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { FabricCrudContract } from "./crud-contract.js";
|
|
11
|
+
import { Context as Ctx, Transaction } from "fabric-contract-api";
|
|
12
|
+
import { Logging } from "@decaf-ts/logging";
|
|
13
|
+
/**
|
|
14
|
+
* @description CRUD contract variant that serializes/deserializes payloads
|
|
15
|
+
* @summary Exposes the same CRUD operations as FabricCrudContract but takes and returns JSON strings to facilitate simple client interactions.
|
|
16
|
+
* @template M - Model type handled by this contract
|
|
17
|
+
* @param {string} name - The contract name
|
|
18
|
+
* @param {Constructor<M>} clazz - The model constructor used to instantiate models from JSON
|
|
19
|
+
* @return {void}
|
|
20
|
+
* @class SerializedCrudContract
|
|
21
|
+
* @example
|
|
22
|
+
* const contract = new SerializedCrudContract<MyModel>('MyModelContract', MyModel);
|
|
23
|
+
* // Client submits JSON string payloads and receives JSON string responses
|
|
24
|
+
*/
|
|
25
|
+
export class SerializedCrudContract extends FabricCrudContract {
|
|
26
|
+
constructor(name, clazz) {
|
|
27
|
+
super(name, clazz);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @description Creates a logger for a specific chaincode context
|
|
31
|
+
* @summary Returns a ContractLogger instance configured for the current context
|
|
32
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
33
|
+
* @return {ContractLogger} The logger instance
|
|
34
|
+
*/
|
|
35
|
+
logFor(ctx) {
|
|
36
|
+
return Logging.for(SerializedCrudContract, {}, ctx);
|
|
37
|
+
}
|
|
38
|
+
async create(ctx, model) {
|
|
39
|
+
const log = this.logFor(ctx).for(this.create);
|
|
40
|
+
log.info(`Creating model: ${model}`);
|
|
41
|
+
const m = this.deserialize(model);
|
|
42
|
+
log.info(`Model deserialized: ${JSON.stringify(m)}`);
|
|
43
|
+
return this.serialize((await super.create(ctx, m)));
|
|
44
|
+
}
|
|
45
|
+
async read(ctx, key) {
|
|
46
|
+
const log = this.logFor(ctx).for(this.read);
|
|
47
|
+
log.info(`Reading id: ${key}`);
|
|
48
|
+
return this.serialize((await super.read(ctx, key)));
|
|
49
|
+
}
|
|
50
|
+
async update(ctx, model) {
|
|
51
|
+
const log = this.logFor(ctx).for(this.update);
|
|
52
|
+
log.info(`Updating model: ${model}`);
|
|
53
|
+
return this.serialize((await super.update(ctx, model)));
|
|
54
|
+
}
|
|
55
|
+
async delete(ctx, key) {
|
|
56
|
+
const log = this.logFor(ctx).for(this.delete);
|
|
57
|
+
log.info(`Deleting id: ${key}`);
|
|
58
|
+
return this.serialize((await super.delete(ctx, key)));
|
|
59
|
+
}
|
|
60
|
+
async deleteAll(ctx, keys) {
|
|
61
|
+
const parsedKeys = JSON.parse(keys);
|
|
62
|
+
const log = this.logFor(ctx).for(this.deleteAll);
|
|
63
|
+
log.info(`deleting ${parsedKeys.length} entries from the table`);
|
|
64
|
+
return JSON.stringify((await super.deleteAll(ctx, parsedKeys)).map((m) => this.serialize(m)));
|
|
65
|
+
}
|
|
66
|
+
async readAll(ctx, keys) {
|
|
67
|
+
const parsedKeys = JSON.parse(keys);
|
|
68
|
+
const log = this.logFor(ctx).for(this.readAll);
|
|
69
|
+
log.info(`reading ${parsedKeys.length} entries from the table`);
|
|
70
|
+
return JSON.stringify((await super.readAll(ctx, parsedKeys)).map((m) => this.serialize(m)));
|
|
71
|
+
}
|
|
72
|
+
async updateAll(ctx, models) {
|
|
73
|
+
const log = this.logFor(ctx).for(this.updateAll);
|
|
74
|
+
const list = JSON.parse(models);
|
|
75
|
+
const modelList = list
|
|
76
|
+
.map((m) => this.deserialize(m))
|
|
77
|
+
.map((m) => new this.clazz(m));
|
|
78
|
+
log.info(`Updating ${modelList.length} entries to the table`);
|
|
79
|
+
return JSON.stringify((await super.updateAll(ctx, modelList)).map((m) => this.serialize(m)));
|
|
80
|
+
}
|
|
81
|
+
async raw(ctx, rawInput, docsOnly) {
|
|
82
|
+
const parsedInput = JSON.parse(rawInput);
|
|
83
|
+
return super.raw(ctx, parsedInput, docsOnly);
|
|
84
|
+
}
|
|
85
|
+
async init(ctx) {
|
|
86
|
+
await super.init(ctx);
|
|
87
|
+
}
|
|
88
|
+
async healthcheck(ctx) {
|
|
89
|
+
//TODO: TRIM NOT WORKING CHECK LATER
|
|
90
|
+
return JSON.stringify(await super.healthcheck(ctx));
|
|
91
|
+
}
|
|
92
|
+
async createAll(ctx, models) {
|
|
93
|
+
const log = this.logFor(ctx).for(this.createAll);
|
|
94
|
+
const list = JSON.parse(models);
|
|
95
|
+
const modelList = list
|
|
96
|
+
.map((m) => this.deserialize(m))
|
|
97
|
+
.map((m) => new this.clazz(m));
|
|
98
|
+
log.info(`Adding ${modelList.length} entries to the table`);
|
|
99
|
+
return JSON.stringify((await super.createAll(ctx, modelList)).map((m) => this.serialize(m)));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
__decorate([
|
|
103
|
+
Transaction(),
|
|
104
|
+
__metadata("design:type", Function),
|
|
105
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
106
|
+
__metadata("design:returntype", Promise)
|
|
107
|
+
], SerializedCrudContract.prototype, "create", null);
|
|
108
|
+
__decorate([
|
|
109
|
+
Transaction(false),
|
|
110
|
+
__metadata("design:type", Function),
|
|
111
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
112
|
+
__metadata("design:returntype", Promise)
|
|
113
|
+
], SerializedCrudContract.prototype, "read", null);
|
|
114
|
+
__decorate([
|
|
115
|
+
Transaction(),
|
|
116
|
+
__metadata("design:type", Function),
|
|
117
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
118
|
+
__metadata("design:returntype", Promise)
|
|
119
|
+
], SerializedCrudContract.prototype, "update", null);
|
|
120
|
+
__decorate([
|
|
121
|
+
Transaction(),
|
|
122
|
+
__metadata("design:type", Function),
|
|
123
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
124
|
+
__metadata("design:returntype", Promise)
|
|
125
|
+
], SerializedCrudContract.prototype, "delete", null);
|
|
126
|
+
__decorate([
|
|
127
|
+
Transaction(),
|
|
128
|
+
__metadata("design:type", Function),
|
|
129
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
130
|
+
__metadata("design:returntype", Promise)
|
|
131
|
+
], SerializedCrudContract.prototype, "deleteAll", null);
|
|
132
|
+
__decorate([
|
|
133
|
+
Transaction(false),
|
|
134
|
+
__metadata("design:type", Function),
|
|
135
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
136
|
+
__metadata("design:returntype", Promise)
|
|
137
|
+
], SerializedCrudContract.prototype, "readAll", null);
|
|
138
|
+
__decorate([
|
|
139
|
+
Transaction(),
|
|
140
|
+
__metadata("design:type", Function),
|
|
141
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
142
|
+
__metadata("design:returntype", Promise)
|
|
143
|
+
], SerializedCrudContract.prototype, "updateAll", null);
|
|
144
|
+
__decorate([
|
|
145
|
+
Transaction(false),
|
|
146
|
+
__metadata("design:type", Function),
|
|
147
|
+
__metadata("design:paramtypes", [Ctx, String, Boolean]),
|
|
148
|
+
__metadata("design:returntype", Promise)
|
|
149
|
+
], SerializedCrudContract.prototype, "raw", null);
|
|
150
|
+
__decorate([
|
|
151
|
+
Transaction(),
|
|
152
|
+
__metadata("design:type", Function),
|
|
153
|
+
__metadata("design:paramtypes", [Ctx]),
|
|
154
|
+
__metadata("design:returntype", Promise)
|
|
155
|
+
], SerializedCrudContract.prototype, "init", null);
|
|
156
|
+
__decorate([
|
|
157
|
+
Transaction(false),
|
|
158
|
+
__metadata("design:type", Function),
|
|
159
|
+
__metadata("design:paramtypes", [Ctx]),
|
|
160
|
+
__metadata("design:returntype", Promise)
|
|
161
|
+
], SerializedCrudContract.prototype, "healthcheck", null);
|
|
162
|
+
__decorate([
|
|
163
|
+
Transaction(),
|
|
164
|
+
__metadata("design:type", Function),
|
|
165
|
+
__metadata("design:paramtypes", [Ctx, String]),
|
|
166
|
+
__metadata("design:returntype", Promise)
|
|
167
|
+
], SerializedCrudContract.prototype, "createAll", null);
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplZC1jcnVkLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbnRyYWN0cy9jcnVkL3NlcmlhbGl6ZWQtY3J1ZC1jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMkJBQXdCO0FBR3JELE9BQU8sRUFBVyxPQUFPLElBQUksR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBTyxzQkFFWCxTQUFRLGtCQUFxQjtJQUM3QixZQUFZLElBQVksRUFBRSxLQUFxQjtRQUM3QyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNhLE1BQU0sQ0FBQyxHQUFZO1FBQ2pDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFtQixDQUFDO0lBQ3hFLENBQUM7SUFHYyxBQUFOLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBUSxFQUFFLEtBQWE7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBSSxLQUFLLENBQUMsQ0FBQztRQUVyQyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FB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Qzs7cUNBQ00sR0FBRzs7a0RBSTNCO0FBR2M7SUFEZCxXQUFXLEVBQUU7O3FDQUNhLEdBQUc7O29EQUk3QjtBQUdjO0lBRGQsV0FBVyxFQUFFOztxQ0FDYSxHQUFHOztvREFJN0I7QUFHYztJQURkLFdBQVcsRUFBRTs7cUNBQ2dCLEdBQUc7O3VEQVdoQztBQUdjO0lBRGQsV0FBVyxDQUFDLEtBQUssQ0FBQzs7cUNBQ1MsR0FBRzs7cURBVzlCO0FBR2M7SUFEZCxXQUFXLEVBQUU7O3FDQUNnQixHQUFHOzt1REFhaEM7QUFHYztJQURkLFdBQVcsQ0FBQyxLQUFLLENBQUM7O3FDQUVaLEdBQUc7O2lEQU1UO0FBR2M7SUFEZCxXQUFXLEVBQUU7O3FDQUNXLEdBQUc7O2tEQUUzQjtBQUdjO0lBRGQsV0FBVyxDQUFDLEtBQUssQ0FBQzs7cUNBQ2EsR0FBRzs7eURBR2xDO0FBR2M7SUFEZCxXQUFXLEVBQUU7O3FDQUNnQixHQUFHOzt1REFhaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYWJyaWNDcnVkQ29udHJhY3QgfSBmcm9tIFwiLi9jcnVkLWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ29udGV4dCwgQ29udGV4dCBhcyBDdHgsIFRyYW5zYWN0aW9uIH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENvbnRyYWN0TG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ1JVRCBjb250cmFjdCB2YXJpYW50IHRoYXQgc2VyaWFsaXplcy9kZXNlcmlhbGl6ZXMgcGF5bG9hZHNcbiAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIHNhbWUgQ1JVRCBvcGVyYXRpb25zIGFzIEZhYnJpY0NydWRDb250cmFjdCBidXQgdGFrZXMgYW5kIHJldHVybnMgSlNPTiBzdHJpbmdzIHRvIGZhY2lsaXRhdGUgc2ltcGxlIGNsaWVudCBpbnRlcmFjdGlvbnMuXG4gKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIGNvbnRyYWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBjb250cmFjdCBuYW1lXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIHRvIGluc3RhbnRpYXRlIG1vZGVscyBmcm9tIEpTT05cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgU2VyaWFsaXplZENydWRDb250cmFjdFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNvbnRyYWN0ID0gbmV3IFNlcmlhbGl6ZWRDcnVkQ29udHJhY3Q8TXlNb2RlbD4oJ015TW9kZWxDb250cmFjdCcsIE15TW9kZWwpO1xuICogLy8gQ2xpZW50IHN1Ym1pdHMgSlNPTiBzdHJpbmcgcGF5bG9hZHMgYW5kIHJlY2VpdmVzIEpTT04gc3RyaW5nIHJlc3BvbnNlc1xuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplZENydWRDb250cmFjdDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEZhYnJpY0NydWRDb250cmFjdDxNPiB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY2xheno6IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIobmFtZSwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBDb250cmFjdExvZ2dlciBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEByZXR1cm4ge0NvbnRyYWN0TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgbG9nRm9yKGN0eDogQ29udGV4dCk6IENvbnRyYWN0TG9nZ2VyIHtcbiAgICByZXR1cm4gTG9nZ2luZy5mb3IoU2VyaWFsaXplZENydWRDb250cmFjdCwge30sIGN0eCkgYXMgQ29udHJhY3RMb2dnZXI7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGUoY3R4OiBDdHgsIG1vZGVsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nRm9yKGN0eCkuZm9yKHRoaXMuY3JlYXRlKTtcbiAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgbW9kZWw6ICR7bW9kZWx9YCk7XG5cbiAgICBjb25zdCBtID0gdGhpcy5kZXNlcmlhbGl6ZTxNPihtb2RlbCk7XG5cbiAgICBsb2cuaW5mbyhgTW9kZWwgZGVzZXJpYWxpemVkOiAke0pTT04uc3RyaW5naWZ5KG0pfWApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgoYXdhaXQgc3VwZXIuY3JlYXRlKGN0eCwgbSkpIGFzIE0pO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyByZWFkKGN0eDogQ3R4LCBrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy5yZWFkKTtcbiAgICBsb2cuaW5mbyhgUmVhZGluZyBpZDogJHtrZXl9YCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKChhd2FpdCBzdXBlci5yZWFkKGN0eCwga2V5KSkgYXMgTSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoY3R4OiBDdHgsIG1vZGVsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nRm9yKGN0eCkuZm9yKHRoaXMudXBkYXRlKTtcbiAgICBsb2cuaW5mbyhgVXBkYXRpbmcgbW9kZWw6ICR7bW9kZWx9YCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKChhd2FpdCBzdXBlci51cGRhdGUoY3R4LCBtb2RlbCkpIGFzIE0pO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGN0eDogQ3R4LCBrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy5kZWxldGUpO1xuICAgIGxvZy5pbmZvKGBEZWxldGluZyBpZDogJHtrZXl9YCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKChhd2FpdCBzdXBlci5kZWxldGUoY3R4LCBrZXkpKSBhcyBNKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbigpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChjdHg6IEN0eCwga2V5czogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJzZWRLZXlzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoa2V5cyk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy5kZWxldGVBbGwpO1xuXG4gICAgbG9nLmluZm8oYGRlbGV0aW5nICR7cGFyc2VkS2V5cy5sZW5ndGh9IGVudHJpZXMgZnJvbSB0aGUgdGFibGVgKTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIuZGVsZXRlQWxsKGN0eCwgcGFyc2VkS2V5cykpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChjdHg6IEN0eCwga2V5czogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJzZWRLZXlzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoa2V5cyk7XG5cbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZ0ZvcihjdHgpLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7cGFyc2VkS2V5cy5sZW5ndGh9IGVudHJpZXMgZnJvbSB0aGUgdGFibGVgKTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIucmVhZEFsbChjdHgsIHBhcnNlZEtleXMpKSBhcyBNW10pLm1hcCgobSkgPT5cbiAgICAgICAgdGhpcy5zZXJpYWxpemUobSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKClcbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKGN0eDogQ3R4LCBtb2RlbHM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy51cGRhdGVBbGwpO1xuICAgIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShtb2RlbHMpO1xuICAgIGNvbnN0IG1vZGVsTGlzdDogTVtdID0gbGlzdFxuICAgICAgLm1hcCgobSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShtKSlcbiAgICAgIC5tYXAoKG0pID0+IG5ldyB0aGlzLmNsYXp6KG0pKTtcblxuICAgIGxvZy5pbmZvKGBVcGRhdGluZyAke21vZGVsTGlzdC5sZW5ndGh9IGVudHJpZXMgdG8gdGhlIHRhYmxlYCk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgKChhd2FpdCBzdXBlci51cGRhdGVBbGwoY3R4LCBtb2RlbExpc3QpKSBhcyBNW10pLm1hcChcbiAgICAgICAgKG0pID0+IHRoaXMuc2VyaWFsaXplKG0pIGFzIHN0cmluZ1xuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIG92ZXJyaWRlIGFzeW5jIHJhdyhcbiAgICBjdHg6IEN0eCxcbiAgICByYXdJbnB1dDogc3RyaW5nLFxuICAgIGRvY3NPbmx5OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyc2VkSW5wdXQ6IE1hbmdvUXVlcnkgPSBKU09OLnBhcnNlKHJhd0lucHV0KTtcbiAgICByZXR1cm4gc3VwZXIucmF3KGN0eCwgcGFyc2VkSW5wdXQsIGRvY3NPbmx5KTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbigpXG4gIG92ZXJyaWRlIGFzeW5jIGluaXQoY3R4OiBDdHgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5pbml0KGN0eCk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIG92ZXJyaWRlIGFzeW5jIGhlYWx0aGNoZWNrKGN0eDogQ3R4KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvL1RPRE86IFRSSU0gTk9UIFdPUktJTkcgQ0hFQ0sgTEFURVJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgc3VwZXIuaGVhbHRoY2hlY2soY3R4KSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoY3R4OiBDdHgsIG1vZGVsczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZ0ZvcihjdHgpLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgY29uc3QgbGlzdDogc3RyaW5nW10gPSBKU09OLnBhcnNlKG1vZGVscyk7XG4gICAgY29uc3QgbW9kZWxMaXN0OiBNW10gPSBsaXN0XG4gICAgICAubWFwKChtKSA9PiB0aGlzLmRlc2VyaWFsaXplKG0pKVxuICAgICAgLm1hcCgobSkgPT4gbmV3IHRoaXMuY2xhenoobSkpO1xuXG4gICAgbG9nLmluZm8oYEFkZGluZyAke21vZGVsTGlzdC5sZW5ndGh9IGVudHJpZXMgdG8gdGhlIHRhYmxlYCk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgKChhd2FpdCBzdXBlci5jcmVhdGVBbGwoY3R4LCBtb2RlbExpc3QpKSBhcyBNW10pLm1hcChcbiAgICAgICAgKG0pID0+IHRoaXMuc2VyaWFsaXplKG0pIGFzIHN0cmluZ1xuICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { Context } from "fabric-contract-api";
|
|
2
|
+
import { Allowance, ERC20Token, ERC20Wallet } from "./models";
|
|
3
|
+
import { FabricCrudContract } from "../crud/crud-contract";
|
|
4
|
+
/**
|
|
5
|
+
* @description ERC20 token contract base for Hyperledger Fabric
|
|
6
|
+
* @summary Implements ERC20-like token logic using repositories and adapters, providing standard token operations such as balance queries, transfers, approvals, minting and burning.
|
|
7
|
+
* @param {string} name - The contract name used to scope token identity
|
|
8
|
+
* @note https://eips.ethereum.org/EIPS/eip-20
|
|
9
|
+
* @return {void}
|
|
10
|
+
* @class FabricERC20Contract
|
|
11
|
+
* @example
|
|
12
|
+
* class MyTokenContract extends FabricERC20Contract {
|
|
13
|
+
* constructor() { super('MyToken'); }
|
|
14
|
+
* }
|
|
15
|
+
* // The contract exposes methods like Transfer, Approve, Mint, Burn, etc.
|
|
16
|
+
* @mermaid
|
|
17
|
+
* sequenceDiagram
|
|
18
|
+
* participant Client
|
|
19
|
+
* participant Contract
|
|
20
|
+
* participant WalletRepo
|
|
21
|
+
* participant TokenRepo
|
|
22
|
+
* participant Ledger
|
|
23
|
+
* Client->>Contract: Transfer(ctx, to, value)
|
|
24
|
+
* Contract->>WalletRepo: read(from)
|
|
25
|
+
* Contract->>WalletRepo: read(to)
|
|
26
|
+
* Contract->>Ledger: putState(updated balances)
|
|
27
|
+
* Contract-->>Client: success
|
|
28
|
+
*/
|
|
29
|
+
export declare abstract class FabricERC20Contract extends FabricCrudContract<ERC20Wallet> {
|
|
30
|
+
private walletRepository;
|
|
31
|
+
private tokenRepository;
|
|
32
|
+
private allowanceRepository;
|
|
33
|
+
protected constructor(name: string);
|
|
34
|
+
TokenName(ctx: Context): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Return the symbol of the token. E.g. “HIX”.
|
|
37
|
+
*
|
|
38
|
+
* @param {Context} ctx the transaction context
|
|
39
|
+
* @returns {String} Returns the symbol of the token
|
|
40
|
+
*/
|
|
41
|
+
Symbol(ctx: Context): Promise<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Return the number of decimals the token uses
|
|
44
|
+
* e.g. 8, means to divide the token amount by 100000000 to get its user representation.
|
|
45
|
+
*
|
|
46
|
+
* @param {Context} ctx the transaction context
|
|
47
|
+
* @returns {Number} Returns the number of decimals
|
|
48
|
+
*/
|
|
49
|
+
Decimals(ctx: Context): Promise<number>;
|
|
50
|
+
/**
|
|
51
|
+
* Return the total token supply.
|
|
52
|
+
*
|
|
53
|
+
* @param {Context} ctx the transaction context
|
|
54
|
+
* @returns {Number} Returns the total token supply
|
|
55
|
+
*/
|
|
56
|
+
TotalSupply(ctx: Context): Promise<number>;
|
|
57
|
+
/**
|
|
58
|
+
* BalanceOf returns the balance of the given account.
|
|
59
|
+
*
|
|
60
|
+
* @param {Context} ctx the transaction context
|
|
61
|
+
* @param {String} owner The owner from which the balance will be retrieved
|
|
62
|
+
* @returns {Number} Returns the account balance
|
|
63
|
+
*/
|
|
64
|
+
BalanceOf(ctx: Context, owner: string): Promise<number>;
|
|
65
|
+
/**
|
|
66
|
+
* @summary Transfer transfers tokens from client account to recipient account.
|
|
67
|
+
* @description recipient account must be a valid clientID as returned by the ClientAccountID() function.
|
|
68
|
+
*
|
|
69
|
+
* @param {Context} ctx the transaction context
|
|
70
|
+
* @param {String} to The recipient
|
|
71
|
+
* @param {number} value The amount of token to be transferred
|
|
72
|
+
*
|
|
73
|
+
* @returns {Boolean} Return whether the transfer was successful or not
|
|
74
|
+
*/
|
|
75
|
+
Transfer(ctx: Context, to: string, value: number): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Transfer `value` amount of tokens from `from` to `to`.
|
|
78
|
+
*
|
|
79
|
+
* @param {Context} ctx the transaction context
|
|
80
|
+
* @param {String} from The sender
|
|
81
|
+
* @param {String} to The recipient
|
|
82
|
+
* @param {number} value The amount of token to be transferred
|
|
83
|
+
* @returns {Boolean} Return whether the transfer was successful or not
|
|
84
|
+
*/
|
|
85
|
+
TransferFrom(ctx: Context, from: string, to: string, value: number): Promise<boolean>;
|
|
86
|
+
_transfer(ctx: Context, from: string, to: string, value: number): Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Allows `spender` to spend `value` amount of tokens from the owner. New Approve calls override the previous allowance.
|
|
89
|
+
* @note https://eips.ethereum.org/EIPS/eip-20
|
|
90
|
+
*
|
|
91
|
+
* @param {Context} ctx the transaction context
|
|
92
|
+
* @param {String} spender The spender
|
|
93
|
+
* @param {number} value The amount of tokens to be approved for transfer
|
|
94
|
+
* @returns {Boolean} Return whether the approval was successful or not
|
|
95
|
+
*/
|
|
96
|
+
Approve(ctx: Context, spender: string, value: number): Promise<boolean>;
|
|
97
|
+
/**
|
|
98
|
+
* Returns the amount of tokens which ` ` is allowed to withdraw from `owner`.
|
|
99
|
+
*
|
|
100
|
+
* @param {Context} ctx the transaction context
|
|
101
|
+
* @param {String} owner The owner of tokens
|
|
102
|
+
* @param {String} spender The spender who are able to transfer the tokens
|
|
103
|
+
* @returns {number} Return the amount of remaining tokens allowed to spent
|
|
104
|
+
*/
|
|
105
|
+
Allowance(ctx: Context, owner: string, spender: string): Promise<number>;
|
|
106
|
+
_getAllowance(ctx: Context, owner: string, spender: string): Promise<Allowance>;
|
|
107
|
+
/**
|
|
108
|
+
* Set optional infomation for a token.
|
|
109
|
+
*
|
|
110
|
+
* @param {Context} ctx the transaction context
|
|
111
|
+
* @param {String} name The name of the token
|
|
112
|
+
* @param {String} symbol The symbol of the token
|
|
113
|
+
* @param {String} decimals The decimals of the token
|
|
114
|
+
* @param {String} totalSupply The totalSupply of the token
|
|
115
|
+
*/
|
|
116
|
+
Initialize(ctx: Context, token: ERC20Token): Promise<boolean>;
|
|
117
|
+
CheckInitialized(ctx: Context): Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Mint creates new tokens and adds them to minter's account balance
|
|
120
|
+
*
|
|
121
|
+
* @param {Context} ctx the transaction context
|
|
122
|
+
* @param {number} amount amount of tokens to be minted
|
|
123
|
+
* @returns {Object} The balance
|
|
124
|
+
*/
|
|
125
|
+
Mint(ctx: Context, amount: number): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Burn redeem tokens from minter's account balance
|
|
128
|
+
*
|
|
129
|
+
* @param {Context} ctx the transaction context
|
|
130
|
+
* @param {number} amount amount of tokens to be burned
|
|
131
|
+
* @returns {Object} The balance
|
|
132
|
+
*/
|
|
133
|
+
Burn(ctx: Context, amount: number): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* BurnFrom redeem tokens from account allowence and balance
|
|
136
|
+
*
|
|
137
|
+
* @param {Context} ctx the transaction context
|
|
138
|
+
* @param {number} account account from where tokens will be burned
|
|
139
|
+
* @param {number} amount amount of tokens to be burned
|
|
140
|
+
* @returns {Object} The balance
|
|
141
|
+
*/
|
|
142
|
+
BurnFrom(ctx: Context, account: string, amount: number): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* ClientAccountBalance returns the balance of the requesting client's account.
|
|
145
|
+
*
|
|
146
|
+
* @param {Context} ctx the transaction context
|
|
147
|
+
* @returns {Number} Returns the account balance
|
|
148
|
+
*/
|
|
149
|
+
ClientAccountBalance(ctx: Context): Promise<number>;
|
|
150
|
+
ClientAccountID(ctx: Context): Promise<string>;
|
|
151
|
+
}
|