@alephium/web3 0.5.0-rc.12 → 0.5.0-rc.14
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/alephium-web3.min.js +1 -1
- package/dist/alephium-web3.min.js.map +1 -1
- package/dist/src/contract/contract.d.ts +6 -3
- package/dist/src/contract/contract.js +31 -28
- package/dist/src/signer/signer.d.ts +4 -2
- package/dist/src/signer/signer.js +26 -8
- package/dist/src/signer/types.d.ts +2 -0
- package/package.json +1 -1
- package/src/contract/contract.ts +31 -29
- package/src/signer/signer.ts +33 -9
- package/src/signer/types.ts +8 -1
|
@@ -257,6 +257,8 @@ export interface CallContractResult<R> {
|
|
|
257
257
|
txOutputs: Output[];
|
|
258
258
|
events: ContractEvent[];
|
|
259
259
|
}
|
|
260
|
+
export declare const CreateContractEventAddress: string;
|
|
261
|
+
export declare const DestroyContractEventAddress: string;
|
|
260
262
|
export interface SystemEventSig extends EventSig {
|
|
261
263
|
optionalFieldNames?: string[];
|
|
262
264
|
optionalFieldTypes?: string[];
|
|
@@ -279,10 +281,11 @@ export declare abstract class ContractInstance {
|
|
|
279
281
|
constructor(address: Address);
|
|
280
282
|
}
|
|
281
283
|
export declare function fetchContractState<F extends Fields, I extends ContractInstance>(contract: ContractFactory<I, F>, instance: ContractInstance): Promise<ContractState<F>>;
|
|
282
|
-
export declare function subscribeContractCreatedEvent(
|
|
283
|
-
export declare function subscribeContractDestroyedEvent(
|
|
284
|
+
export declare function subscribeContractCreatedEvent(options: SubscribeOptions<ContractCreatedEvent>, fromCount?: number): EventSubscription;
|
|
285
|
+
export declare function subscribeContractDestroyedEvent(options: SubscribeOptions<ContractDestroyedEvent>, fromCount?: number): EventSubscription;
|
|
284
286
|
export declare function decodeEvent<F extends Fields, M extends ContractEvent<F>>(contract: Contract, instance: ContractInstance, event: node.ContractEvent, targetEventIndex: number): M;
|
|
285
287
|
export declare function subscribeContractEvent<F extends Fields, M extends ContractEvent<F>>(contract: Contract, instance: ContractInstance, options: SubscribeOptions<M>, eventName: string, fromCount?: number): EventSubscription;
|
|
286
|
-
export declare function
|
|
288
|
+
export declare function subscribeContractEvents(contract: Contract, instance: ContractInstance, options: SubscribeOptions<ContractEvent<any>>, fromCount?: number): EventSubscription;
|
|
287
289
|
export declare function callMethod<I, F extends Fields, A extends Arguments, R>(contract: ContractFactory<I, F>, instance: ContractInstance, methodName: string, params: Optional<CallContractParams<A>, 'args'>): Promise<CallContractResult<R>>;
|
|
290
|
+
export declare function getContractEventsCurrentCount(contractAddress: Address): Promise<number>;
|
|
288
291
|
export {};
|
|
@@ -43,7 +43,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
43
43
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
44
|
};
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.callMethod = exports.
|
|
46
|
+
exports.getContractEventsCurrentCount = exports.callMethod = exports.subscribeContractEvents = exports.subscribeContractEvent = exports.decodeEvent = exports.subscribeContractDestroyedEvent = exports.subscribeContractCreatedEvent = exports.fetchContractState = exports.ContractInstance = exports.testMethod = exports.subscribeEventsFromContract = exports.decodeContractDestroyedEvent = exports.decodeContractCreatedEvent = exports.DestroyContractEventAddress = exports.CreateContractEventAddress = exports.ContractFactory = exports.randomTxId = exports.toApiVals = exports.Script = exports.Contract = exports.Artifact = exports.Project = exports.DEFAULT_COMPILER_OPTIONS = exports.DEFAULT_NODE_COMPILER_OPTIONS = void 0;
|
|
47
47
|
const buffer_1 = require("buffer/");
|
|
48
48
|
const crypto_1 = require("crypto");
|
|
49
49
|
const fs_1 = __importDefault(require("fs"));
|
|
@@ -886,6 +886,13 @@ class ContractFactory {
|
|
|
886
886
|
}
|
|
887
887
|
}
|
|
888
888
|
exports.ContractFactory = ContractFactory;
|
|
889
|
+
function specialContractAddress(n) {
|
|
890
|
+
const bytes = new Uint8Array(32).fill(0);
|
|
891
|
+
bytes[31] = n;
|
|
892
|
+
return (0, utils_1.addressFromContractId)((0, utils_1.binToHex)(bytes));
|
|
893
|
+
}
|
|
894
|
+
exports.CreateContractEventAddress = specialContractAddress(-1);
|
|
895
|
+
exports.DestroyContractEventAddress = specialContractAddress(-2);
|
|
889
896
|
function decodeSystemEvent(event, systemEventSig, eventIndex) {
|
|
890
897
|
if (event.eventIndex !== eventIndex) {
|
|
891
898
|
throw new Error(`Invalid event index: ${event.eventIndex}, expected: ${eventIndex}`);
|
|
@@ -968,20 +975,20 @@ async function fetchContractState(contract, instance) {
|
|
|
968
975
|
};
|
|
969
976
|
}
|
|
970
977
|
exports.fetchContractState = fetchContractState;
|
|
971
|
-
function subscribeContractCreatedEvent(
|
|
972
|
-
return subscribeEventsFromContract(options,
|
|
978
|
+
function subscribeContractCreatedEvent(options, fromCount) {
|
|
979
|
+
return subscribeEventsFromContract(options, exports.CreateContractEventAddress, Contract.ContractCreatedEventIndex, (event) => {
|
|
973
980
|
return {
|
|
974
981
|
...decodeContractCreatedEvent(event),
|
|
975
|
-
contractAddress:
|
|
982
|
+
contractAddress: exports.CreateContractEventAddress
|
|
976
983
|
};
|
|
977
984
|
}, fromCount);
|
|
978
985
|
}
|
|
979
986
|
exports.subscribeContractCreatedEvent = subscribeContractCreatedEvent;
|
|
980
|
-
function subscribeContractDestroyedEvent(
|
|
981
|
-
return subscribeEventsFromContract(options,
|
|
987
|
+
function subscribeContractDestroyedEvent(options, fromCount) {
|
|
988
|
+
return subscribeEventsFromContract(options, exports.DestroyContractEventAddress, Contract.ContractDestroyedEventIndex, (event) => {
|
|
982
989
|
return {
|
|
983
990
|
...decodeContractDestroyedEvent(event),
|
|
984
|
-
contractAddress:
|
|
991
|
+
contractAddress: exports.DestroyContractEventAddress
|
|
985
992
|
};
|
|
986
993
|
}, fromCount);
|
|
987
994
|
}
|
|
@@ -1010,27 +1017,12 @@ function subscribeContractEvent(contract, instance, options, eventName, fromCoun
|
|
|
1010
1017
|
return subscribeEventsFromContract(options, instance.address, eventIndex, (event) => decodeEvent(contract, instance, event, eventIndex), fromCount);
|
|
1011
1018
|
}
|
|
1012
1019
|
exports.subscribeContractEvent = subscribeContractEvent;
|
|
1013
|
-
function
|
|
1020
|
+
function subscribeContractEvents(contract, instance, options, fromCount) {
|
|
1014
1021
|
const messageCallback = (event) => {
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
contractAddress: instance.address
|
|
1020
|
-
});
|
|
1021
|
-
}
|
|
1022
|
-
case Contract.ContractDestroyedEventIndex: {
|
|
1023
|
-
return options.messageCallback({
|
|
1024
|
-
...decodeContractDestroyedEvent(event),
|
|
1025
|
-
contractAddress: instance.address
|
|
1026
|
-
});
|
|
1027
|
-
}
|
|
1028
|
-
default:
|
|
1029
|
-
return options.messageCallback({
|
|
1030
|
-
...decodeEvent(contract, instance, event, event.eventIndex),
|
|
1031
|
-
contractAddress: instance.address
|
|
1032
|
-
});
|
|
1033
|
-
}
|
|
1022
|
+
return options.messageCallback({
|
|
1023
|
+
...decodeEvent(contract, instance, event, event.eventIndex),
|
|
1024
|
+
contractAddress: instance.address
|
|
1025
|
+
});
|
|
1034
1026
|
};
|
|
1035
1027
|
const errorCallback = (err, subscription) => {
|
|
1036
1028
|
return options.errorCallback(err, subscription);
|
|
@@ -1042,7 +1034,7 @@ function subscribeAllEvents(contract, instance, options, fromCount) {
|
|
|
1042
1034
|
};
|
|
1043
1035
|
return (0, events_1.subscribeToEvents)(opt, instance.address, fromCount);
|
|
1044
1036
|
}
|
|
1045
|
-
exports.
|
|
1037
|
+
exports.subscribeContractEvents = subscribeContractEvents;
|
|
1046
1038
|
async function callMethod(contract, instance, methodName, params) {
|
|
1047
1039
|
const methodIndex = contract.contract.getMethodIndex(methodName);
|
|
1048
1040
|
const txId = params?.txId ?? randomTxId();
|
|
@@ -1052,3 +1044,14 @@ async function callMethod(contract, instance, methodName, params) {
|
|
|
1052
1044
|
return callResult;
|
|
1053
1045
|
}
|
|
1054
1046
|
exports.callMethod = callMethod;
|
|
1047
|
+
async function getContractEventsCurrentCount(contractAddress) {
|
|
1048
|
+
return (0, global_1.getCurrentNodeProvider)()
|
|
1049
|
+
.events.getEventsContractContractaddressCurrentCount(contractAddress)
|
|
1050
|
+
.catch((error) => {
|
|
1051
|
+
if (error instanceof Error && error.message.includes(`${contractAddress} not found`)) {
|
|
1052
|
+
return 0;
|
|
1053
|
+
}
|
|
1054
|
+
throw error;
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
exports.getContractEventsCurrentCount = getContractEventsCurrentCount;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ExplorerProvider, NodeProvider } from '../api';
|
|
2
2
|
import { node } from '../api';
|
|
3
|
-
import { Account, EnableOptionsBase, Destination, SignDeployContractTxParams, SignDeployContractTxResult, SignExecuteScriptTxParams, SignExecuteScriptTxResult, SignMessageParams, SignMessageResult, SignTransferTxParams, SignTransferTxResult, SignUnsignedTxParams, SignUnsignedTxResult, SubmissionResult, SubmitTransactionParams, KeyType } from './types';
|
|
3
|
+
import { Account, EnableOptionsBase, Destination, SignDeployContractTxParams, SignDeployContractTxResult, SignExecuteScriptTxParams, SignExecuteScriptTxResult, SignMessageParams, SignMessageResult, SignTransferTxParams, SignTransferTxResult, SignUnsignedTxParams, SignUnsignedTxResult, SubmissionResult, SubmitTransactionParams, KeyType, MessageHasher } from './types';
|
|
4
4
|
export declare abstract class SignerProvider {
|
|
5
5
|
abstract get nodeProvider(): NodeProvider | undefined;
|
|
6
6
|
abstract get explorerProvider(): ExplorerProvider | undefined;
|
|
@@ -52,7 +52,9 @@ export declare abstract class SignerProviderWithCachedAccounts<T extends Account
|
|
|
52
52
|
getAccounts(): Promise<T[]>;
|
|
53
53
|
getAccount(address: string): Promise<T>;
|
|
54
54
|
}
|
|
55
|
-
export declare function
|
|
55
|
+
export declare function extendMessage(message: string): string;
|
|
56
|
+
export declare function hashMessage(message: string, hasher: MessageHasher): string;
|
|
57
|
+
export declare function verifySignedMessage(message: string, messageHasher: MessageHasher, publicKey: string, signature: string, keyType?: KeyType): boolean;
|
|
56
58
|
export declare function toApiDestination(data: Destination): node.Destination;
|
|
57
59
|
export declare function toApiDestinations(data: Destination[]): node.Destination[];
|
|
58
60
|
export declare function fromApiDestination(data: node.Destination): Destination;
|
|
@@ -43,7 +43,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
43
43
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
44
|
};
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.fromApiDestination = exports.toApiDestinations = exports.toApiDestination = exports.verifySignedMessage = exports.SignerProviderWithCachedAccounts = exports.SignerProviderWithMultipleAccounts = exports.SignerProviderSimple = exports.InteractiveSignerProvider = exports.SignerProvider = void 0;
|
|
46
|
+
exports.fromApiDestination = exports.toApiDestinations = exports.toApiDestination = exports.verifySignedMessage = exports.hashMessage = exports.extendMessage = exports.SignerProviderWithCachedAccounts = exports.SignerProviderWithMultipleAccounts = exports.SignerProviderSimple = exports.InteractiveSignerProvider = exports.SignerProvider = void 0;
|
|
47
|
+
const buffer_1 = require("buffer/");
|
|
48
|
+
const crypto_1 = require("crypto");
|
|
47
49
|
const api_1 = require("../api");
|
|
48
50
|
const utils = __importStar(require("../utils"));
|
|
49
51
|
const blakejs_1 = __importDefault(require("blakejs"));
|
|
@@ -135,9 +137,8 @@ class SignerProviderSimple extends SignerProvider {
|
|
|
135
137
|
return { signature, ...response };
|
|
136
138
|
}
|
|
137
139
|
async signMessage(params) {
|
|
138
|
-
const
|
|
139
|
-
const
|
|
140
|
-
const signature = await this.signRaw(params.signerAddress, utils.binToHex(messageHash));
|
|
140
|
+
const messageHash = hashMessage(params.message, params.messageHasher);
|
|
141
|
+
const signature = await this.signRaw(params.signerAddress, messageHash);
|
|
141
142
|
return { signature: signature };
|
|
142
143
|
}
|
|
143
144
|
}
|
|
@@ -198,10 +199,27 @@ exports.SignerProviderWithCachedAccounts = SignerProviderWithCachedAccounts;
|
|
|
198
199
|
function extendMessage(message) {
|
|
199
200
|
return 'Alephium Signed Message: ' + message;
|
|
200
201
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
202
|
+
exports.extendMessage = extendMessage;
|
|
203
|
+
function hashMessage(message, hasher) {
|
|
204
|
+
switch (hasher) {
|
|
205
|
+
case 'alephium':
|
|
206
|
+
return utils.binToHex(blakejs_1.default.blake2b(extendMessage(message), undefined, 32));
|
|
207
|
+
case 'sha256':
|
|
208
|
+
const sha256 = (0, crypto_1.createHash)('sha256');
|
|
209
|
+
sha256.update(buffer_1.Buffer.from(message));
|
|
210
|
+
return utils.binToHex(sha256.digest());
|
|
211
|
+
case 'blake2b':
|
|
212
|
+
return utils.binToHex(blakejs_1.default.blake2b(message, undefined, 32));
|
|
213
|
+
case 'identity':
|
|
214
|
+
return message;
|
|
215
|
+
default:
|
|
216
|
+
throw Error(`Invalid message hasher: ${hasher}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.hashMessage = hashMessage;
|
|
220
|
+
function verifySignedMessage(message, messageHasher, publicKey, signature, keyType) {
|
|
221
|
+
const messageHash = hashMessage(message, messageHasher);
|
|
222
|
+
return utils.verifySignature(messageHash, publicKey, signature, keyType);
|
|
205
223
|
}
|
|
206
224
|
exports.verifySignedMessage = verifySignedMessage;
|
|
207
225
|
function toApiDestination(data) {
|
|
@@ -88,10 +88,12 @@ export interface SignUnsignedTxResult {
|
|
|
88
88
|
gasAmount: number;
|
|
89
89
|
gasPrice: Number256;
|
|
90
90
|
}
|
|
91
|
+
export declare type MessageHasher = 'alephium' | 'sha256' | 'blake2b' | 'identity';
|
|
91
92
|
export interface SignMessageParams {
|
|
92
93
|
signerAddress: string;
|
|
93
94
|
signerKeyType?: KeyType;
|
|
94
95
|
message: string;
|
|
96
|
+
messageHasher: MessageHasher;
|
|
95
97
|
}
|
|
96
98
|
export interface SignMessageResult {
|
|
97
99
|
signature: string;
|
package/package.json
CHANGED
package/src/contract/contract.ts
CHANGED
|
@@ -53,7 +53,8 @@ import {
|
|
|
53
53
|
assertType,
|
|
54
54
|
Eq,
|
|
55
55
|
Optional,
|
|
56
|
-
groupOfAddress
|
|
56
|
+
groupOfAddress,
|
|
57
|
+
addressFromContractId
|
|
57
58
|
} from '../utils'
|
|
58
59
|
import { getCurrentNodeProvider } from '../global'
|
|
59
60
|
import * as path from 'path'
|
|
@@ -1360,6 +1361,15 @@ export interface CallContractResult<R> {
|
|
|
1360
1361
|
events: ContractEvent[]
|
|
1361
1362
|
}
|
|
1362
1363
|
|
|
1364
|
+
function specialContractAddress(n: number): string {
|
|
1365
|
+
const bytes = new Uint8Array(32).fill(0)
|
|
1366
|
+
bytes[31] = n
|
|
1367
|
+
return addressFromContractId(binToHex(bytes))
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
export const CreateContractEventAddress = specialContractAddress(-1)
|
|
1371
|
+
export const DestroyContractEventAddress = specialContractAddress(-2)
|
|
1372
|
+
|
|
1363
1373
|
export interface SystemEventSig extends EventSig {
|
|
1364
1374
|
optionalFieldNames?: string[]
|
|
1365
1375
|
optionalFieldTypes?: string[]
|
|
@@ -1472,18 +1482,17 @@ export async function fetchContractState<F extends Fields, I extends ContractIns
|
|
|
1472
1482
|
}
|
|
1473
1483
|
|
|
1474
1484
|
export function subscribeContractCreatedEvent(
|
|
1475
|
-
instance: ContractInstance,
|
|
1476
1485
|
options: SubscribeOptions<ContractCreatedEvent>,
|
|
1477
1486
|
fromCount?: number
|
|
1478
1487
|
): EventSubscription {
|
|
1479
1488
|
return subscribeEventsFromContract(
|
|
1480
1489
|
options,
|
|
1481
|
-
|
|
1490
|
+
CreateContractEventAddress,
|
|
1482
1491
|
Contract.ContractCreatedEventIndex,
|
|
1483
1492
|
(event) => {
|
|
1484
1493
|
return {
|
|
1485
1494
|
...decodeContractCreatedEvent(event),
|
|
1486
|
-
contractAddress:
|
|
1495
|
+
contractAddress: CreateContractEventAddress
|
|
1487
1496
|
}
|
|
1488
1497
|
},
|
|
1489
1498
|
fromCount
|
|
@@ -1491,18 +1500,17 @@ export function subscribeContractCreatedEvent(
|
|
|
1491
1500
|
}
|
|
1492
1501
|
|
|
1493
1502
|
export function subscribeContractDestroyedEvent(
|
|
1494
|
-
instance: ContractInstance,
|
|
1495
1503
|
options: SubscribeOptions<ContractDestroyedEvent>,
|
|
1496
1504
|
fromCount?: number
|
|
1497
1505
|
): EventSubscription {
|
|
1498
1506
|
return subscribeEventsFromContract(
|
|
1499
1507
|
options,
|
|
1500
|
-
|
|
1508
|
+
DestroyContractEventAddress,
|
|
1501
1509
|
Contract.ContractDestroyedEventIndex,
|
|
1502
1510
|
(event) => {
|
|
1503
1511
|
return {
|
|
1504
1512
|
...decodeContractDestroyedEvent(event),
|
|
1505
|
-
contractAddress:
|
|
1513
|
+
contractAddress: DestroyContractEventAddress
|
|
1506
1514
|
}
|
|
1507
1515
|
},
|
|
1508
1516
|
fromCount
|
|
@@ -1552,34 +1560,17 @@ export function subscribeContractEvent<F extends Fields, M extends ContractEvent
|
|
|
1552
1560
|
)
|
|
1553
1561
|
}
|
|
1554
1562
|
|
|
1555
|
-
export function
|
|
1563
|
+
export function subscribeContractEvents(
|
|
1556
1564
|
contract: Contract,
|
|
1557
1565
|
instance: ContractInstance,
|
|
1558
1566
|
options: SubscribeOptions<ContractEvent<any>>,
|
|
1559
1567
|
fromCount?: number
|
|
1560
1568
|
): EventSubscription {
|
|
1561
1569
|
const messageCallback = (event: node.ContractEvent): Promise<void> => {
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
contractAddress: instance.address
|
|
1567
|
-
})
|
|
1568
|
-
}
|
|
1569
|
-
|
|
1570
|
-
case Contract.ContractDestroyedEventIndex: {
|
|
1571
|
-
return options.messageCallback({
|
|
1572
|
-
...decodeContractDestroyedEvent(event),
|
|
1573
|
-
contractAddress: instance.address
|
|
1574
|
-
})
|
|
1575
|
-
}
|
|
1576
|
-
|
|
1577
|
-
default:
|
|
1578
|
-
return options.messageCallback({
|
|
1579
|
-
...decodeEvent(contract, instance, event, event.eventIndex),
|
|
1580
|
-
contractAddress: instance.address
|
|
1581
|
-
})
|
|
1582
|
-
}
|
|
1570
|
+
return options.messageCallback({
|
|
1571
|
+
...decodeEvent(contract, instance, event, event.eventIndex),
|
|
1572
|
+
contractAddress: instance.address
|
|
1573
|
+
})
|
|
1583
1574
|
}
|
|
1584
1575
|
const errorCallback = (err: any, subscription: Subscription<node.ContractEvent>): Promise<void> => {
|
|
1585
1576
|
return options.errorCallback(err, subscription as unknown as Subscription<ContractEvent<any>>)
|
|
@@ -1610,3 +1601,14 @@ export async function callMethod<I, F extends Fields, A extends Arguments, R>(
|
|
|
1610
1601
|
const callResult = contract.contract.fromApiCallContractResult(result, txId, methodIndex)
|
|
1611
1602
|
return callResult as CallContractResult<R>
|
|
1612
1603
|
}
|
|
1604
|
+
|
|
1605
|
+
export async function getContractEventsCurrentCount(contractAddress: Address): Promise<number> {
|
|
1606
|
+
return getCurrentNodeProvider()
|
|
1607
|
+
.events.getEventsContractContractaddressCurrentCount(contractAddress)
|
|
1608
|
+
.catch((error) => {
|
|
1609
|
+
if (error instanceof Error && error.message.includes(`${contractAddress} not found`)) {
|
|
1610
|
+
return 0
|
|
1611
|
+
}
|
|
1612
|
+
throw error
|
|
1613
|
+
})
|
|
1614
|
+
}
|
package/src/signer/signer.ts
CHANGED
|
@@ -16,6 +16,8 @@ You should have received a copy of the GNU Lesser General Public License
|
|
|
16
16
|
along with the library. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import { Buffer } from 'buffer/'
|
|
20
|
+
import { createHash } from 'crypto'
|
|
19
21
|
import { ExplorerProvider, fromApiNumber256, fromApiTokens, NodeProvider, toApiNumber256, toApiTokens } from '../api'
|
|
20
22
|
import { node } from '../api'
|
|
21
23
|
import * as utils from '../utils'
|
|
@@ -38,7 +40,8 @@ import {
|
|
|
38
40
|
SignUnsignedTxResult,
|
|
39
41
|
SubmissionResult,
|
|
40
42
|
SubmitTransactionParams,
|
|
41
|
-
KeyType
|
|
43
|
+
KeyType,
|
|
44
|
+
MessageHasher
|
|
42
45
|
} from './types'
|
|
43
46
|
import { TransactionBuilder } from './tx-builder'
|
|
44
47
|
import { addressFromPublicKey, groupOfAddress } from '../utils'
|
|
@@ -176,9 +179,8 @@ export abstract class SignerProviderSimple extends SignerProvider {
|
|
|
176
179
|
}
|
|
177
180
|
|
|
178
181
|
async signMessage(params: SignMessageParams): Promise<SignMessageResult> {
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
const signature = await this.signRaw(params.signerAddress, utils.binToHex(messageHash))
|
|
182
|
+
const messageHash = hashMessage(params.message, params.messageHasher)
|
|
183
|
+
const signature = await this.signRaw(params.signerAddress, messageHash)
|
|
182
184
|
return { signature: signature }
|
|
183
185
|
}
|
|
184
186
|
|
|
@@ -242,14 +244,36 @@ export abstract class SignerProviderWithCachedAccounts<T extends Account> extend
|
|
|
242
244
|
}
|
|
243
245
|
}
|
|
244
246
|
|
|
245
|
-
function extendMessage(message: string): string {
|
|
247
|
+
export function extendMessage(message: string): string {
|
|
246
248
|
return 'Alephium Signed Message: ' + message
|
|
247
249
|
}
|
|
248
250
|
|
|
249
|
-
export function
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
251
|
+
export function hashMessage(message: string, hasher: MessageHasher): string {
|
|
252
|
+
switch (hasher) {
|
|
253
|
+
case 'alephium':
|
|
254
|
+
return utils.binToHex(blake.blake2b(extendMessage(message), undefined, 32))
|
|
255
|
+
case 'sha256':
|
|
256
|
+
const sha256 = createHash('sha256')
|
|
257
|
+
sha256.update(Buffer.from(message))
|
|
258
|
+
return utils.binToHex(sha256.digest())
|
|
259
|
+
case 'blake2b':
|
|
260
|
+
return utils.binToHex(blake.blake2b(message, undefined, 32))
|
|
261
|
+
case 'identity':
|
|
262
|
+
return message
|
|
263
|
+
default:
|
|
264
|
+
throw Error(`Invalid message hasher: ${hasher}`)
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function verifySignedMessage(
|
|
269
|
+
message: string,
|
|
270
|
+
messageHasher: MessageHasher,
|
|
271
|
+
publicKey: string,
|
|
272
|
+
signature: string,
|
|
273
|
+
keyType?: KeyType
|
|
274
|
+
): boolean {
|
|
275
|
+
const messageHash = hashMessage(message, messageHasher)
|
|
276
|
+
return utils.verifySignature(messageHash, publicKey, signature, keyType)
|
|
253
277
|
}
|
|
254
278
|
|
|
255
279
|
export function toApiDestination(data: Destination): node.Destination {
|
package/src/signer/types.ts
CHANGED
|
@@ -136,12 +136,19 @@ export interface SignUnsignedTxResult {
|
|
|
136
136
|
}
|
|
137
137
|
assertType<Eq<SignUnsignedTxResult, SignTransferTxResult>>
|
|
138
138
|
|
|
139
|
+
export type MessageHasher =
|
|
140
|
+
| 'alephium' // Message is prefixed with 'Alephium signed message: ' before hashed with blake2b
|
|
141
|
+
| 'sha256'
|
|
142
|
+
| 'blake2b'
|
|
143
|
+
| 'identity' // No hash is used, the message to be 32 bytes
|
|
144
|
+
|
|
139
145
|
export interface SignMessageParams {
|
|
140
146
|
signerAddress: string
|
|
141
147
|
signerKeyType?: KeyType
|
|
142
148
|
message: string
|
|
149
|
+
messageHasher: MessageHasher
|
|
143
150
|
}
|
|
144
|
-
assertType<Eq<SignMessageParams, { message: string } & SignerAddress>>()
|
|
151
|
+
assertType<Eq<SignMessageParams, { message: string; messageHasher: MessageHasher } & SignerAddress>>()
|
|
145
152
|
export interface SignMessageResult {
|
|
146
153
|
signature: string
|
|
147
154
|
}
|