@bizjs/chainkit 0.0.1
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 +21 -0
- package/README.md +18 -0
- package/dist/ChainSdkFactory.d.ts +14 -0
- package/dist/ChainSdkFactory.js +42 -0
- package/dist/ChainSdkFactory.js.map +1 -0
- package/dist/chain-sdks/AptosChain.d.ts +5 -0
- package/dist/chain-sdks/AptosChain.js +20 -0
- package/dist/chain-sdks/AptosChain.js.map +1 -0
- package/dist/chain-sdks/BitcoinChain.d.ts +14 -0
- package/dist/chain-sdks/BitcoinChain.js +136 -0
- package/dist/chain-sdks/BitcoinChain.js.map +1 -0
- package/dist/chain-sdks/CardanoChain.d.ts +6 -0
- package/dist/chain-sdks/CardanoChain.js +59 -0
- package/dist/chain-sdks/CardanoChain.js.map +1 -0
- package/dist/chain-sdks/EVMChain.d.ts +6 -0
- package/dist/chain-sdks/EVMChain.js +23 -0
- package/dist/chain-sdks/EVMChain.js.map +1 -0
- package/dist/chain-sdks/SolanaChain.d.ts +4 -0
- package/dist/chain-sdks/SolanaChain.js +16 -0
- package/dist/chain-sdks/SolanaChain.js.map +1 -0
- package/dist/chain-sdks/StarknetChain.d.ts +11 -0
- package/dist/chain-sdks/StarknetChain.js +204 -0
- package/dist/chain-sdks/StarknetChain.js.map +1 -0
- package/dist/chain-sdks/TVMChain.d.ts +13 -0
- package/dist/chain-sdks/TVMChain.js +89 -0
- package/dist/chain-sdks/TVMChain.js.map +1 -0
- package/dist/constants/index.d.ts +9 -0
- package/dist/constants/index.js +14 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +62 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 BizJS
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ChainType } from './constants';
|
|
2
|
+
import { AptosChain } from './chain-sdks/AptosChain';
|
|
3
|
+
import { BitcoinChain } from './chain-sdks/BitcoinChain';
|
|
4
|
+
import { CardanoChain } from './chain-sdks/CardanoChain';
|
|
5
|
+
import { EvmChain } from './chain-sdks/EVMChain';
|
|
6
|
+
import { SolanaChain } from './chain-sdks/SolanaChain';
|
|
7
|
+
import { TVMChain } from './chain-sdks/TVMChain';
|
|
8
|
+
type ChainSdkResult<T extends ChainType> = T extends ChainType.Aptos ? AptosChain : T extends ChainType.Bitcoin ? BitcoinChain : T extends ChainType.Cardano ? CardanoChain : T extends ChainType.EVM ? EvmChain : T extends ChainType.Solana ? SolanaChain : T extends ChainType.Starknet ? never : T extends ChainType.TVM ? TVMChain : never;
|
|
9
|
+
export declare class ChainSdkFactory {
|
|
10
|
+
private static readonly _sdkCache;
|
|
11
|
+
static getChainSdk<T extends ChainType>(chainType: T): ChainSdkResult<T>;
|
|
12
|
+
private static _getChainSdk;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChainSdkFactory = void 0;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const AptosChain_1 = require("./chain-sdks/AptosChain");
|
|
6
|
+
const BitcoinChain_1 = require("./chain-sdks/BitcoinChain");
|
|
7
|
+
const CardanoChain_1 = require("./chain-sdks/CardanoChain");
|
|
8
|
+
const EVMChain_1 = require("./chain-sdks/EVMChain");
|
|
9
|
+
const SolanaChain_1 = require("./chain-sdks/SolanaChain");
|
|
10
|
+
const StarknetChain_1 = require("./chain-sdks/StarknetChain");
|
|
11
|
+
const TVMChain_1 = require("./chain-sdks/TVMChain");
|
|
12
|
+
class ChainSdkFactory {
|
|
13
|
+
static getChainSdk(chainType) {
|
|
14
|
+
switch (chainType) {
|
|
15
|
+
case constants_1.ChainType.Aptos:
|
|
16
|
+
return this._getChainSdk(chainType, AptosChain_1.AptosChain);
|
|
17
|
+
case constants_1.ChainType.Bitcoin:
|
|
18
|
+
return this._getChainSdk(chainType, BitcoinChain_1.BitcoinChain);
|
|
19
|
+
case constants_1.ChainType.Cardano:
|
|
20
|
+
return this._getChainSdk(chainType, CardanoChain_1.CardanoChain);
|
|
21
|
+
case constants_1.ChainType.EVM:
|
|
22
|
+
return this._getChainSdk(chainType, EVMChain_1.EvmChain);
|
|
23
|
+
case constants_1.ChainType.Solana:
|
|
24
|
+
return this._getChainSdk(chainType, SolanaChain_1.SolanaChain);
|
|
25
|
+
case constants_1.ChainType.Starknet:
|
|
26
|
+
return this._getChainSdk(chainType, StarknetChain_1.StarknetChain);
|
|
27
|
+
case constants_1.ChainType.TVM:
|
|
28
|
+
return this._getChainSdk(chainType, TVMChain_1.TVMChain);
|
|
29
|
+
default:
|
|
30
|
+
throw new Error(`Chain type ${chainType} is not supported`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
static _getChainSdk(chainType, Ctor) {
|
|
34
|
+
if (!this._sdkCache[chainType]) {
|
|
35
|
+
this._sdkCache[chainType] = new Ctor();
|
|
36
|
+
}
|
|
37
|
+
return this._sdkCache[chainType];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.ChainSdkFactory = ChainSdkFactory;
|
|
41
|
+
ChainSdkFactory._sdkCache = {};
|
|
42
|
+
//# sourceMappingURL=ChainSdkFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainSdkFactory.js","sourceRoot":"","sources":["../src/ChainSdkFactory.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,wDAAqD;AACrD,4DAAyD;AACzD,4DAAyD;AACzD,oDAAiD;AACjD,0DAAuD;AACvD,8DAA2D;AAC3D,oDAAiD;AAkBjD,MAAa,eAAe;IAG1B,MAAM,CAAC,WAAW,CAAsB,SAAY;QAClD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,qBAAS,CAAC,KAAK;gBAClB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,uBAAU,CAAC,CAAC;YAClD,KAAK,qBAAS,CAAC,OAAO;gBACpB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,2BAAY,CAAC,CAAC;YACpD,KAAK,qBAAS,CAAC,OAAO;gBACpB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,2BAAY,CAAC,CAAC;YACpD,KAAK,qBAAS,CAAC,GAAG;gBAChB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,mBAAQ,CAAC,CAAC;YAChD,KAAK,qBAAS,CAAC,MAAM;gBACnB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,yBAAW,CAAC,CAAC;YACnD,KAAK,qBAAS,CAAC,QAAQ;gBACrB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,6BAAa,CAAC,CAAC;YACrD,KAAK,qBAAS,CAAC,GAAG;gBAChB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,mBAAQ,CAAC,CAAC;YAEhD;gBACE,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,mBAAmB,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,YAAY,CAAsB,SAAY,EAAE,IAAgB;QAC7E,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAsB,CAAC;IACxD,CAAC;;AA9BH,0CA+BC;AA9ByB,yBAAS,GAA0D,EAAE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AptosChain = void 0;
|
|
4
|
+
const ts_sdk_1 = require("@aptos-labs/ts-sdk");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class AptosChain {
|
|
7
|
+
async verifyMessage(publicKey, message, signature) {
|
|
8
|
+
return (0, utils_1.naclSignDetachedVerify)(Buffer.from(message), Buffer.from(signature, 'hex'), this._getPublicKeyBuffer(publicKey));
|
|
9
|
+
}
|
|
10
|
+
_getPublicKeyBuffer(publicKey) {
|
|
11
|
+
const key = publicKey.slice(2, 66);
|
|
12
|
+
return Buffer.from(key, 'hex');
|
|
13
|
+
}
|
|
14
|
+
async getDerivedAddress(publicKey) {
|
|
15
|
+
const pubKey = new ts_sdk_1.Ed25519PublicKey(this._getPublicKeyBuffer(publicKey));
|
|
16
|
+
return ts_sdk_1.Account.authKey({ publicKey: pubKey }).derivedAddress().bcsToHex().toString();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.AptosChain = AptosChain;
|
|
20
|
+
//# sourceMappingURL=AptosChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AptosChain.js","sourceRoot":"","sources":["../../src/chain-sdks/AptosChain.ts"],"names":[],"mappings":";;;AAAA,+CAA+D;AAE/D,oCAAkD;AAElD,MAAa,UAAU;IAQrB,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAiB;QACvE,OAAO,IAAA,8BAAsB,EAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EACpB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAC7B,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CACpC,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,SAAiB;QAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QAMvC,MAAM,MAAM,GAAG,IAAI,yBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;QACzE,OAAO,gBAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;IACvF,CAAC;CACF;AA9BD,gCA8BC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class BitcoinChain {
|
|
2
|
+
private readonly ecpair;
|
|
3
|
+
constructor();
|
|
4
|
+
verifyUnisatMessage(publicKey: string, message: string, signature: string): Promise<boolean>;
|
|
5
|
+
verifyEcdsaMessage(publicKey: string, message: string, signature: string): Promise<boolean>;
|
|
6
|
+
verifyBIP322Message(publicKey: string, message: string, signature: string): Promise<boolean>;
|
|
7
|
+
private _verifyBip322;
|
|
8
|
+
private _validateP2wpkh;
|
|
9
|
+
private _taggedHash;
|
|
10
|
+
private _createToSpend;
|
|
11
|
+
private _createToSign;
|
|
12
|
+
getAddress(publicKey: string, addressType?: 'segwit_taproot' | 'segwit_native'): Promise<string>;
|
|
13
|
+
getNativeAddress(publicKey: string): string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BitcoinChain = void 0;
|
|
4
|
+
const bitcoinjsLib = require("bitcoinjs-lib");
|
|
5
|
+
const wallet_sdk_1 = require("@unisat/wallet-sdk");
|
|
6
|
+
const coin_bitcoin_1 = require("@okxweb3/coin-bitcoin");
|
|
7
|
+
const tinysecp = require("tiny-secp256k1");
|
|
8
|
+
const ecpair_1 = require("ecpair");
|
|
9
|
+
let initResult = null;
|
|
10
|
+
function initBitconjsLibAndEccLib() {
|
|
11
|
+
if (!initResult) {
|
|
12
|
+
bitcoinjsLib.initEccLib(tinysecp);
|
|
13
|
+
const ecpair = (0, ecpair_1.ECPairFactory)(tinysecp);
|
|
14
|
+
initResult = { ecpair };
|
|
15
|
+
}
|
|
16
|
+
return initResult;
|
|
17
|
+
}
|
|
18
|
+
class BitcoinChain {
|
|
19
|
+
constructor() {
|
|
20
|
+
initBitconjsLibAndEccLib();
|
|
21
|
+
this.ecpair = initResult.ecpair;
|
|
22
|
+
}
|
|
23
|
+
async verifyUnisatMessage(publicKey, message, signature) {
|
|
24
|
+
return wallet_sdk_1.message.verifyMessageOfECDSA(publicKey, message, signature);
|
|
25
|
+
}
|
|
26
|
+
async verifyEcdsaMessage(publicKey, message, signature) {
|
|
27
|
+
const wallet = new coin_bitcoin_1.BtcWallet();
|
|
28
|
+
const verified = await wallet.verifyMessage({
|
|
29
|
+
signature,
|
|
30
|
+
data: {
|
|
31
|
+
message,
|
|
32
|
+
publicKey,
|
|
33
|
+
type: coin_bitcoin_1.BITCOIN_MESSAGE_ECDSA,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
return verified;
|
|
37
|
+
}
|
|
38
|
+
async verifyBIP322Message(publicKey, message, signature) {
|
|
39
|
+
const verified = this._verifyBip322(message, publicKey, signature);
|
|
40
|
+
return verified;
|
|
41
|
+
}
|
|
42
|
+
_verifyBip322(message, pubkey, signature) {
|
|
43
|
+
const { payments } = bitcoinjsLib;
|
|
44
|
+
const output = payments.p2wpkh({
|
|
45
|
+
pubkey: Buffer.from(pubkey, 'hex'),
|
|
46
|
+
}).output;
|
|
47
|
+
if (output === undefined) {
|
|
48
|
+
throw new Error('Only supports p2wpkh addresses for now');
|
|
49
|
+
}
|
|
50
|
+
const hash = this._taggedHash('BIP0322-signed-message', Buffer.from(message, 'utf8'));
|
|
51
|
+
const sigBuff = Buffer.from(signature, 'base64');
|
|
52
|
+
const toSpend = this._createToSpend(hash, output);
|
|
53
|
+
const toSign = this._createToSign(toSpend, sigBuff);
|
|
54
|
+
return this._validateP2wpkh(toSign);
|
|
55
|
+
}
|
|
56
|
+
_validateP2wpkh(toSign) {
|
|
57
|
+
const { payments, Transaction, script } = bitcoinjsLib;
|
|
58
|
+
const [witnessSignature, pubkey] = toSign.ins[0].witness;
|
|
59
|
+
const signingOutput = payments.p2pkh({ pubkey }).output;
|
|
60
|
+
const hashForSigning = toSign.hashForWitnessV0(0, signingOutput, 0, Transaction.SIGHASH_ALL);
|
|
61
|
+
const sig = script.signature.decode(witnessSignature);
|
|
62
|
+
const pair = this.ecpair.fromPublicKey(pubkey);
|
|
63
|
+
return pair.verify(hashForSigning, sig.signature);
|
|
64
|
+
}
|
|
65
|
+
_taggedHash(prefix, data) {
|
|
66
|
+
const crypto = bitcoinjsLib.crypto;
|
|
67
|
+
const prefixHash = crypto.sha256(Buffer.from(prefix, 'utf8'));
|
|
68
|
+
return crypto.sha256(Buffer.concat([prefixHash, prefixHash, data]));
|
|
69
|
+
}
|
|
70
|
+
_createToSpend(messageHash, outputScript) {
|
|
71
|
+
const { opcodes, Transaction } = bitcoinjsLib;
|
|
72
|
+
const toSpend = new Transaction();
|
|
73
|
+
toSpend.version = 0;
|
|
74
|
+
toSpend.locktime = 0;
|
|
75
|
+
toSpend.addInput(Buffer.alloc(32, 0), 0xffffffff, 0, Buffer.concat([Buffer.from([opcodes.OP_0, 0x20]), messageHash]));
|
|
76
|
+
toSpend.addOutput(outputScript, 0);
|
|
77
|
+
return toSpend;
|
|
78
|
+
}
|
|
79
|
+
_createToSign(toSpend, signature = Buffer.from([])) {
|
|
80
|
+
const { opcodes, Transaction, script } = bitcoinjsLib;
|
|
81
|
+
if (signature.length === 65) {
|
|
82
|
+
throw new Error('Legacy signatures can be handled with bitcoinjs-message');
|
|
83
|
+
}
|
|
84
|
+
let toSign;
|
|
85
|
+
let isTx;
|
|
86
|
+
try {
|
|
87
|
+
toSign = Transaction.fromBuffer(signature);
|
|
88
|
+
isTx = true;
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
toSign = new Transaction();
|
|
92
|
+
isTx = false;
|
|
93
|
+
}
|
|
94
|
+
if (isTx) {
|
|
95
|
+
const toSpendHash = toSpend.getHash();
|
|
96
|
+
const input = toSign.ins[0];
|
|
97
|
+
throw new Error('Invalid signature');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
toSign.version = 0;
|
|
101
|
+
toSign.locktime = 0;
|
|
102
|
+
toSign.addOutput(Buffer.from([opcodes.OP_RETURN]), 0);
|
|
103
|
+
toSign.addInput(toSpend.getHash(), 0, 0);
|
|
104
|
+
if (signature.length > 0) {
|
|
105
|
+
toSign.ins[0].witness = script.toStack(signature.slice(1));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return toSign;
|
|
109
|
+
}
|
|
110
|
+
async getAddress(publicKey, addressType = 'segwit_taproot') {
|
|
111
|
+
const wallet = new coin_bitcoin_1.BtcWallet();
|
|
112
|
+
if (addressType === 'segwit_taproot') {
|
|
113
|
+
return wallet.getAddressByPublicKey({
|
|
114
|
+
publicKey,
|
|
115
|
+
addressType: 'segwit_taproot',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else if (addressType === 'segwit_native') {
|
|
119
|
+
return wallet.getAddressByPublicKey({
|
|
120
|
+
publicKey,
|
|
121
|
+
addressType: 'segwit_native',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
throw new Error('Invalid addressType');
|
|
125
|
+
}
|
|
126
|
+
getNativeAddress(publicKey) {
|
|
127
|
+
const { payments } = bitcoinjsLib;
|
|
128
|
+
const p = payments.p2wpkh({
|
|
129
|
+
pubkey: Buffer.from(publicKey, 'hex'),
|
|
130
|
+
});
|
|
131
|
+
const segwitAddress = p.address;
|
|
132
|
+
return segwitAddress;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.BitcoinChain = BitcoinChain;
|
|
136
|
+
//# sourceMappingURL=BitcoinChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinChain.js","sourceRoot":"","sources":["../../src/chain-sdks/BitcoinChain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare class CardanoChain {
|
|
2
|
+
verifyMessage(key: string, message: string, signature: string): Promise<boolean>;
|
|
3
|
+
private _message2Hex;
|
|
4
|
+
getStakeAddress(signature: string): Promise<string>;
|
|
5
|
+
getAddress(key: string, addressFormat?: 'mainnet' | 'testnet'): Promise<string>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CardanoChain = void 0;
|
|
4
|
+
const cardano_message_signing_nodejs_1 = require("@emurgo/cardano-message-signing-nodejs");
|
|
5
|
+
const cardano_serialization_lib_nodejs_1 = require("@emurgo/cardano-serialization-lib-nodejs");
|
|
6
|
+
class CardanoChain {
|
|
7
|
+
async verifyMessage(key, message, signature) {
|
|
8
|
+
const decoded = cardano_message_signing_nodejs_1.COSESign1.from_bytes(Buffer.from(signature, 'hex'));
|
|
9
|
+
const payload = decoded.payload();
|
|
10
|
+
const actualMessageHex = Buffer.from(payload).toString('hex');
|
|
11
|
+
const expectMessageHex = this._message2Hex(message);
|
|
12
|
+
const messageMatch = actualMessageHex === expectMessageHex;
|
|
13
|
+
if (messageMatch === false) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const keyBytes = cardano_message_signing_nodejs_1.COSEKey.from_bytes(Buffer.from(key, 'hex'));
|
|
17
|
+
const pubKeyBytes = keyBytes.header(cardano_message_signing_nodejs_1.Label.new_int(cardano_message_signing_nodejs_1.Int.new_negative(cardano_message_signing_nodejs_1.BigNum.from_str('2')))).as_bytes();
|
|
18
|
+
const publicKey = cardano_serialization_lib_nodejs_1.PublicKey.from_bytes(pubKeyBytes);
|
|
19
|
+
const sig = cardano_serialization_lib_nodejs_1.Ed25519Signature.from_bytes(decoded.signature());
|
|
20
|
+
const receivedData = decoded.signed_data().to_bytes();
|
|
21
|
+
const isVerified = publicKey.verify(receivedData, sig);
|
|
22
|
+
return isVerified && messageMatch;
|
|
23
|
+
}
|
|
24
|
+
_message2Hex(message) {
|
|
25
|
+
let messageHex = '';
|
|
26
|
+
for (let i = 0, l = message.length; i < l; i++) {
|
|
27
|
+
const charHex = message.charCodeAt(i).toString(16);
|
|
28
|
+
messageHex += charHex;
|
|
29
|
+
}
|
|
30
|
+
return messageHex;
|
|
31
|
+
}
|
|
32
|
+
async getStakeAddress(signature) {
|
|
33
|
+
const decoded = cardano_message_signing_nodejs_1.COSESign1.from_bytes(Buffer.from(signature, 'hex'));
|
|
34
|
+
const headermap = decoded.headers().protected().deserialized_headers();
|
|
35
|
+
const addressHex = Buffer.from(headermap.header(cardano_message_signing_nodejs_1.Label.new_text('address')).to_bytes())
|
|
36
|
+
.toString('hex')
|
|
37
|
+
.substring(4);
|
|
38
|
+
const addr = cardano_serialization_lib_nodejs_1.Address.from_bytes(Buffer.from(addressHex, 'hex'));
|
|
39
|
+
return addr.to_bech32();
|
|
40
|
+
}
|
|
41
|
+
async getAddress(key, addressFormat = 'mainnet') {
|
|
42
|
+
const keyBytes = cardano_message_signing_nodejs_1.COSEKey.from_bytes(Buffer.from(key, 'hex'));
|
|
43
|
+
const pubKeyBytes = keyBytes.header(cardano_message_signing_nodejs_1.Label.new_int(cardano_message_signing_nodejs_1.Int.new_negative(cardano_message_signing_nodejs_1.BigNum.from_str('2')))).as_bytes();
|
|
44
|
+
const pubKey = cardano_serialization_lib_nodejs_1.PublicKey.from_bytes(pubKeyBytes);
|
|
45
|
+
let enterpriseAddress;
|
|
46
|
+
if (addressFormat === 'mainnet') {
|
|
47
|
+
enterpriseAddress = cardano_serialization_lib_nodejs_1.EnterpriseAddress.new(cardano_serialization_lib_nodejs_1.NetworkInfo.mainnet().network_id(), cardano_serialization_lib_nodejs_1.Credential.from_keyhash(pubKey.hash()));
|
|
48
|
+
}
|
|
49
|
+
else if (addressFormat === 'testnet') {
|
|
50
|
+
enterpriseAddress = cardano_serialization_lib_nodejs_1.EnterpriseAddress.new(cardano_serialization_lib_nodejs_1.NetworkInfo.testnet_preprod().network_id(), cardano_serialization_lib_nodejs_1.Credential.from_keyhash(pubKey.hash()));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
throw new Error('Invalid address format');
|
|
54
|
+
}
|
|
55
|
+
return enterpriseAddress.to_address().to_bech32();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.CardanoChain = CardanoChain;
|
|
59
|
+
//# sourceMappingURL=CardanoChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CardanoChain.js","sourceRoot":"","sources":["../../src/chain-sdks/CardanoChain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Address, Hex } from 'viem';
|
|
2
|
+
export declare class EvmChain {
|
|
3
|
+
verifyEIP712Message(address: Address, message: string, signature: Hex): Promise<boolean>;
|
|
4
|
+
verifyMessage(address: Address, message: string, signature: Hex): Promise<boolean>;
|
|
5
|
+
getChecksumAddress(address: string): Promise<string>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EvmChain = void 0;
|
|
4
|
+
const viem_1 = require("viem");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class EvmChain {
|
|
7
|
+
async verifyEIP712Message(address, message, signature) {
|
|
8
|
+
const typedData = (0, utils_1.safeParseJSON)(message);
|
|
9
|
+
if (!typedData) {
|
|
10
|
+
throw new Error('Invalid typed data');
|
|
11
|
+
}
|
|
12
|
+
const valid = await (0, viem_1.verifyTypedData)(Object.assign(Object.assign({}, typedData), { address, signature }));
|
|
13
|
+
return valid;
|
|
14
|
+
}
|
|
15
|
+
async verifyMessage(address, message, signature) {
|
|
16
|
+
return (0, viem_1.verifyMessage)({ address, message, signature });
|
|
17
|
+
}
|
|
18
|
+
async getChecksumAddress(address) {
|
|
19
|
+
return (0, viem_1.getAddress)(address);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.EvmChain = EvmChain;
|
|
23
|
+
//# sourceMappingURL=EVMChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EVMChain.js","sourceRoot":"","sources":["../../src/chain-sdks/EVMChain.ts"],"names":[],"mappings":";;;AAAA,+BAAgF;AAChF,oCAAyC;AAEzC,MAAa,QAAQ;IACnB,KAAK,CAAC,mBAAmB,CAAC,OAAgB,EAAE,OAAe,EAAE,SAAc;QACzE,MAAM,SAAS,GAKX,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC;QAE3B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAA,sBAAe,kCAAM,SAAS,KAAE,OAAO,EAAE,SAAS,IAAG,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAgB,EAAE,OAAe,EAAE,SAAc;QACnE,OAAO,IAAA,oBAAa,EAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe;QACtC,OAAO,IAAA,iBAAU,EAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACF;AAxBD,4BAwBC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SolanaChain = void 0;
|
|
4
|
+
const bs58_1 = require("bs58");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class SolanaChain {
|
|
7
|
+
async verifyMessage(publicKey, message, signature) {
|
|
8
|
+
const sig = Buffer.from(bs58_1.default.decode(signature));
|
|
9
|
+
return (0, utils_1.naclSignDetachedVerify)(Buffer.from(message), sig, Buffer.from(bs58_1.default.decode(publicKey)));
|
|
10
|
+
}
|
|
11
|
+
async getAddress(publicKey) {
|
|
12
|
+
return publicKey;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.SolanaChain = SolanaChain;
|
|
16
|
+
//# sourceMappingURL=SolanaChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolanaChain.js","sourceRoot":"","sources":["../../src/chain-sdks/SolanaChain.ts"],"names":[],"mappings":";;;AAAA,+BAAwB;AAExB,oCAAkD;AAElD,MAAa,WAAW;IACtB,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAiB;QACvE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,cAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAChD,OAAO,IAAA,8BAAsB,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,cAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AATD,kCASC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { constants } from 'starknet';
|
|
2
|
+
export declare class StarknetAccountNotFoundError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class StarknetChain {
|
|
6
|
+
verifyMessage(publicKey: string, message: string, signature: string, options: {
|
|
7
|
+
network: constants.NetworkName;
|
|
8
|
+
nodeUrl?: string;
|
|
9
|
+
}): Promise<boolean>;
|
|
10
|
+
getChecksumAddress(publicKey: string): Promise<string>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetChain = exports.StarknetAccountNotFoundError = void 0;
|
|
4
|
+
const starknet_1 = require("starknet");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
const ArgentAccount = {
|
|
7
|
+
abi: [
|
|
8
|
+
{
|
|
9
|
+
name: 'braavos_account::account::interface::IBraavosAccount',
|
|
10
|
+
type: 'interface',
|
|
11
|
+
items: [
|
|
12
|
+
{
|
|
13
|
+
name: '__validate__',
|
|
14
|
+
type: 'function',
|
|
15
|
+
inputs: [
|
|
16
|
+
{
|
|
17
|
+
name: 'calls',
|
|
18
|
+
type: 'core::array::Span::<core::starknet::account::Call>',
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
outputs: [
|
|
22
|
+
{
|
|
23
|
+
type: 'core::felt252',
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
state_mutability: 'external',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: '__execute__',
|
|
30
|
+
type: 'function',
|
|
31
|
+
inputs: [
|
|
32
|
+
{
|
|
33
|
+
name: 'calls',
|
|
34
|
+
type: 'core::array::Span::<core::starknet::account::Call>',
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
outputs: [
|
|
38
|
+
{
|
|
39
|
+
type: 'core::array::Array::<core::array::Span::<core::felt252>>',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
state_mutability: 'external',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'is_valid_signature',
|
|
46
|
+
type: 'function',
|
|
47
|
+
inputs: [
|
|
48
|
+
{
|
|
49
|
+
name: 'hash',
|
|
50
|
+
type: 'core::felt252',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'signature',
|
|
54
|
+
type: 'core::array::Span::<core::felt252>',
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
outputs: [
|
|
58
|
+
{
|
|
59
|
+
type: 'core::felt252',
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
state_mutability: 'view',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: '__validate_deploy__',
|
|
66
|
+
type: 'function',
|
|
67
|
+
inputs: [
|
|
68
|
+
{
|
|
69
|
+
name: 'class_hash',
|
|
70
|
+
type: 'core::felt252',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'salt',
|
|
74
|
+
type: 'core::felt252',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'stark_pub_key',
|
|
78
|
+
type: 'braavos_account::signers::signers::StarkPubKey',
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
outputs: [
|
|
82
|
+
{
|
|
83
|
+
type: 'core::felt252',
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
state_mutability: 'view',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: '__validate_declare__',
|
|
90
|
+
type: 'function',
|
|
91
|
+
inputs: [
|
|
92
|
+
{
|
|
93
|
+
name: 'class_hash',
|
|
94
|
+
type: 'core::felt252',
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
outputs: [
|
|
98
|
+
{
|
|
99
|
+
type: 'core::felt252',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
state_mutability: 'view',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'initializer',
|
|
106
|
+
type: 'function',
|
|
107
|
+
inputs: [
|
|
108
|
+
{
|
|
109
|
+
name: 'stark_pub_key',
|
|
110
|
+
type: 'braavos_account::signers::signers::StarkPubKey',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
outputs: [],
|
|
114
|
+
state_mutability: 'external',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'get_version',
|
|
118
|
+
type: 'function',
|
|
119
|
+
inputs: [],
|
|
120
|
+
outputs: [
|
|
121
|
+
{
|
|
122
|
+
type: 'core::felt252',
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
state_mutability: 'view',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'get_required_signer',
|
|
129
|
+
type: 'function',
|
|
130
|
+
inputs: [
|
|
131
|
+
{
|
|
132
|
+
name: 'calls',
|
|
133
|
+
type: 'core::array::Span::<core::starknet::account::Call>',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'fee_amount',
|
|
137
|
+
type: 'core::integer::u128',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'tx_version',
|
|
141
|
+
type: 'core::felt252',
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
outputs: [
|
|
145
|
+
{
|
|
146
|
+
type: 'braavos_account::account::interface::RequiredSigner',
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
state_mutability: 'external',
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
class StarknetAccountNotFoundError extends Error {
|
|
156
|
+
constructor(message) {
|
|
157
|
+
super(message);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.StarknetAccountNotFoundError = StarknetAccountNotFoundError;
|
|
161
|
+
class StarknetChain {
|
|
162
|
+
async verifyMessage(publicKey, message, signature, options) {
|
|
163
|
+
const rpcProviderOptions = {};
|
|
164
|
+
if (options.network === starknet_1.constants.NetworkName.SN_MAIN) {
|
|
165
|
+
rpcProviderOptions.chainId = starknet_1.constants.StarknetChainId.SN_MAIN;
|
|
166
|
+
rpcProviderOptions.nodeUrl = 'https://starknet-mainnet.public.blastapi.io';
|
|
167
|
+
}
|
|
168
|
+
else if (options.network === starknet_1.constants.NetworkName.SN_SEPOLIA) {
|
|
169
|
+
rpcProviderOptions.chainId = starknet_1.constants.StarknetChainId.SN_SEPOLIA;
|
|
170
|
+
rpcProviderOptions.nodeUrl = 'https://starknet-sepolia.public.blastapi.io';
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
throw new Error('Invalid starknet network');
|
|
174
|
+
}
|
|
175
|
+
if (options.nodeUrl) {
|
|
176
|
+
rpcProviderOptions.nodeUrl = options.nodeUrl;
|
|
177
|
+
}
|
|
178
|
+
const provider = new starknet_1.RpcProvider(rpcProviderOptions);
|
|
179
|
+
const contractAccount = new starknet_1.Contract(ArgentAccount.abi, publicKey, provider);
|
|
180
|
+
const msgHash = starknet_1.typedData.getMessageHash((0, utils_1.safeParseJSON)(message), publicKey);
|
|
181
|
+
let verified;
|
|
182
|
+
try {
|
|
183
|
+
const result = await contractAccount.is_valid_signature(msgHash, String(signature || '').split(','));
|
|
184
|
+
if (typeof result === 'bigint') {
|
|
185
|
+
verified = result > 0;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
verified = result.isValid > 0;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (String((err === null || err === void 0 ? void 0 : err.message) || '').includes('Contract not found')) {
|
|
193
|
+
throw new StarknetAccountNotFoundError('Account contract not found on starknet');
|
|
194
|
+
}
|
|
195
|
+
throw err;
|
|
196
|
+
}
|
|
197
|
+
return verified;
|
|
198
|
+
}
|
|
199
|
+
async getChecksumAddress(publicKey) {
|
|
200
|
+
return (0, starknet_1.getChecksumAddress)(publicKey);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.StarknetChain = StarknetChain;
|
|
204
|
+
//# sourceMappingURL=StarknetChain.js.map
|