@grvt/sdk 0.0.1-beta.7 → 0.0.1-beta.8
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/README.md +1 -0
- package/client/GrvtClient.js +7 -0
- package/client/GrvtClient.js.map +1 -1
- package/package.json +1 -1
- package/signing/transfer.js +4 -0
- package/signing/transfer.js.map +1 -1
- package/signing/validation.d.ts +4 -0
- package/signing/validation.js +38 -0
- package/signing/validation.js.map +1 -0
- package/signing/withdraw.js +4 -0
- package/signing/withdraw.js.map +1 -1
package/README.md
CHANGED
|
@@ -65,6 +65,7 @@ const metadata: ITransferMetadata = {
|
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
// Signing options for generating the signature as the third argument for the transfer API
|
|
68
|
+
// Note: nonce must be non-negative and expiration must be within 30 days
|
|
68
69
|
const signingOptions: ISigningOption = {
|
|
69
70
|
nonce: 12345,
|
|
70
71
|
expiration: '1746093221289693252'
|
package/client/GrvtClient.js
CHANGED
|
@@ -8,6 +8,7 @@ const client_1 = require("@grvt/client");
|
|
|
8
8
|
const ethers_1 = require("ethers");
|
|
9
9
|
const withdraw_1 = require("../signing/withdraw");
|
|
10
10
|
const deposit_1 = require("../services/deposit");
|
|
11
|
+
const validation_1 = require("../signing/validation");
|
|
11
12
|
class GrvtClient extends GrvtBaseClient_1.GrvtBaseClient {
|
|
12
13
|
constructor(config) {
|
|
13
14
|
super(config);
|
|
@@ -55,6 +56,9 @@ class GrvtClient extends GrvtBaseClient_1.GrvtBaseClient {
|
|
|
55
56
|
const withdrawalSignature = await (0, withdraw_1.signWithdrawal)(request, this.wallet, this.config.env, options);
|
|
56
57
|
request.signature = withdrawalSignature;
|
|
57
58
|
}
|
|
59
|
+
else {
|
|
60
|
+
(0, validation_1.validateISignature)(request.signature);
|
|
61
|
+
}
|
|
58
62
|
return this.tdgClient.withdrawal(request, config);
|
|
59
63
|
}
|
|
60
64
|
/**
|
|
@@ -79,6 +83,9 @@ class GrvtClient extends GrvtBaseClient_1.GrvtBaseClient {
|
|
|
79
83
|
const transferSignature = await (0, transfer_1.signTransfer)(request, this.wallet, this.config.env, options);
|
|
80
84
|
request.signature = transferSignature;
|
|
81
85
|
}
|
|
86
|
+
else {
|
|
87
|
+
(0, validation_1.validateISignature)(request.signature);
|
|
88
|
+
}
|
|
82
89
|
const config = await this.authenticatedEndpoint();
|
|
83
90
|
return this.tdgClient.transfer(request, config);
|
|
84
91
|
}
|
package/client/GrvtClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrvtClient.js","sourceRoot":"","sources":["../../src/client/GrvtClient.ts"],"names":[],"mappings":";;;AAAA,kDAAmD;AAEnD,qDAAkD;AAClD,iCAAyD;AACzD,yCAAqF;AACrF,mCAAgC;AAUhC,kDAAqD;AACrD,iDAAqD;
|
|
1
|
+
{"version":3,"file":"GrvtClient.js","sourceRoot":"","sources":["../../src/client/GrvtClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/signing/transfer.js
CHANGED
|
@@ -6,7 +6,11 @@ const utils_1 = require("./utils");
|
|
|
6
6
|
const signer_1 = require("./signer");
|
|
7
7
|
const types_1 = require("./types");
|
|
8
8
|
const client_1 = require("@grvt/client");
|
|
9
|
+
const validation_1 = require("./validation");
|
|
9
10
|
const signTransfer = async (transfer, wallet, env, options) => {
|
|
11
|
+
if (options) {
|
|
12
|
+
(0, validation_1.validateISigningOptions)(options);
|
|
13
|
+
}
|
|
10
14
|
const nonce = options?.nonce ?? (0, utils_1.GenerateNonce)();
|
|
11
15
|
const expiration = options?.expiration || (0, utils_1.GenerateExpiration)();
|
|
12
16
|
const domain = (0, domain_1.getEIP712DomainData)(env);
|
package/signing/transfer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/signing/transfer.ts"],"names":[],"mappings":";;;AACA,qCAA+C;AAC/C,mCAA4D;AAC5D,qCAAkC;AAClC,mCAAmC;AAEnC,yCAA0E;
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/signing/transfer.ts"],"names":[],"mappings":";;;AACA,qCAA+C;AAC/C,mCAA4D;AAC5D,qCAAkC;AAClC,mCAAmC;AAEnC,yCAA0E;AAE1E,6CAAuD;AAEhD,MAAM,YAAY,GAAG,KAAK,EAC/B,QAA6B,EAC7B,MAAc,EACd,GAAqB,EACrB,OAAyB,EACJ,EAAE;IACvB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAA,oCAAuB,EAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAA,qBAAa,GAAE,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAA,0BAAkB,GAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAA,4BAAmB,EAAC,GAAG,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,QAAQ,CAAC,eAAe,IAAI,EAAE;QAC3C,cAAc,EAAE,QAAQ,CAAC,mBAAmB,IAAI,EAAE;QAClD,SAAS,EAAE,QAAQ,CAAC,aAAa,IAAI,EAAE;QACvC,YAAY,EAAE,QAAQ,CAAC,iBAAiB,IAAI,EAAE;QAC9C,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,UAAU;KACvB,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QACrD,GAAG,gBAAQ;QACX,MAAM;QACN,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,eAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE7C,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,UAAU;KACvB,CAAC;AACJ,CAAC,CAAC;AArCW,QAAA,YAAY,gBAqCvB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateISignature = exports.validateISigningOptions = void 0;
|
|
4
|
+
const validateISigningOptions = (options) => {
|
|
5
|
+
if (options.nonce) {
|
|
6
|
+
validateNonce(options.nonce);
|
|
7
|
+
}
|
|
8
|
+
if (options.expiration) {
|
|
9
|
+
validateExpiration(options.expiration);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
exports.validateISigningOptions = validateISigningOptions;
|
|
13
|
+
const validateISignature = (signature) => {
|
|
14
|
+
if (signature.nonce) {
|
|
15
|
+
validateNonce(signature.nonce);
|
|
16
|
+
}
|
|
17
|
+
if (signature.expiration) {
|
|
18
|
+
validateExpiration(signature.expiration);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.validateISignature = validateISignature;
|
|
22
|
+
const validateNonce = (nonce) => {
|
|
23
|
+
if (nonce < 0) {
|
|
24
|
+
throw new Error('Nonce must not be negative');
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const validateExpiration = (expiration) => {
|
|
28
|
+
const expirationNs = BigInt(expiration);
|
|
29
|
+
const nowNs = BigInt(Date.now()) * BigInt(1000000);
|
|
30
|
+
const thirtyDaysNs = BigInt(30 * 24 * 60 * 60 * 1000) * BigInt(1000000);
|
|
31
|
+
if (expirationNs < nowNs) {
|
|
32
|
+
throw new Error('Expiration is expired');
|
|
33
|
+
}
|
|
34
|
+
if (expirationNs > nowNs + thirtyDaysNs) {
|
|
35
|
+
throw new Error('Expiration is too far in the future, must be within 30 days');
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/signing/validation.ts"],"names":[],"mappings":";;;AAGO,MAAM,uBAAuB,GAAG,CAAC,OAAwB,EAAE,EAAE;IAClE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,uBAAuB,2BAOlC;AAEK,MAAM,kBAAkB,GAAG,CAAC,SAAqB,EAAE,EAAE;IAC1D,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B;AAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,EAAE;IACtC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAE,EAAE;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,OAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,OAAS,CAAC,CAAC;IAE1E,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,YAAY,GAAG,KAAK,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;AACH,CAAC,CAAC"}
|
package/signing/withdraw.js
CHANGED
|
@@ -6,7 +6,11 @@ const utils_1 = require("./utils");
|
|
|
6
6
|
const signer_1 = require("./signer");
|
|
7
7
|
const types_1 = require("./types");
|
|
8
8
|
const client_1 = require("@grvt/client");
|
|
9
|
+
const validation_1 = require("./validation");
|
|
9
10
|
const signWithdrawal = async (withdrawal, wallet, env, options) => {
|
|
11
|
+
if (options) {
|
|
12
|
+
(0, validation_1.validateISigningOptions)(options);
|
|
13
|
+
}
|
|
10
14
|
const nonce = options?.nonce ?? (0, utils_1.GenerateNonce)();
|
|
11
15
|
const expiration = options?.expiration || (0, utils_1.GenerateExpiration)();
|
|
12
16
|
const domain = (0, domain_1.getEIP712DomainData)(env);
|
package/signing/withdraw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdraw.js","sourceRoot":"","sources":["../../src/signing/withdraw.ts"],"names":[],"mappings":";;;AACA,qCAA+C;AAC/C,mCAA4D;AAC5D,qCAAkC;AAClC,mCAAqC;AAErC,yCAA4E;
|
|
1
|
+
{"version":3,"file":"withdraw.js","sourceRoot":"","sources":["../../src/signing/withdraw.ts"],"names":[],"mappings":";;;AACA,qCAA+C;AAC/C,mCAA4D;AAC5D,qCAAkC;AAClC,mCAAqC;AAErC,yCAA4E;AAE5E,6CAAuD;AAEhD,MAAM,cAAc,GAAG,KAAK,EACjC,UAAiC,EACjC,MAAc,EACd,GAAqB,EACrB,OAAyB,EACJ,EAAE;IACvB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAA,oCAAuB,EAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAA,qBAAa,GAAE,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAA,0BAAkB,GAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAA,4BAAmB,EAAC,GAAG,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,UAAU,CAAC,eAAe,IAAI,EAAE;QAC7C,YAAY,EAAE,UAAU,CAAC,cAAc,IAAI,EAAE;QAC7C,aAAa,EAAE,UAAU,CAAC,QAAQ;YAChC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAS,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,UAAU;KACvB,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QACrD,GAAG,kBAAU;QACb,MAAM;QACN,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,eAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE7C,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,UAAU;KACvB,CAAC;AACJ,CAAC,CAAC;AAtCW,QAAA,cAAc,kBAsCzB"}
|