Skip to content

Commit

Permalink
Merge pull request #23 from sorare/pd/sign-auth-request
Browse files Browse the repository at this point in the history
Add signAuthorizationRequest
  • Loading branch information
piedup authored Aug 3, 2023
2 parents de102c2 + cca8837 commit e31459a
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 2 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"description": "Crypto used in the Sorare stack",
"author": "Sorare",
"license": "MIT",
"version": "2.0.0",
"version": "2.0.1",
"main": "lib.js",
"dependencies": {
"@noble/curves": "^1.0.0",
Expand Down
71 changes: 70 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@ import { keccak_256 as keccak } from '@noble/hashes/sha3';
import { bytesToHex } from '@noble/hashes/utils';
import * as starknet from 'micro-starknet';

import { LimitOrder, Transfer, Signature } from './types';
import {
LimitOrder,
Transfer,
FiatTransfer,
AuthorizationRequest,
Signature,
} from './types';

import {
getTransferMsgHash,
getTransferMsgHashWithFee,
Expand Down Expand Up @@ -141,6 +148,20 @@ const hashMessage = (message: string) => {
return starknet.pedersen(h.substring(0, 32), h.substring(32));
};

const hashFiatTransfer = (fiatTransfer: FiatTransfer) => {
const { mangopayWalletId, operationHash, amount, currency, nonce } =
fiatTransfer;
const message = [
mangopayWalletId,
operationHash,
currency,
amount,
nonce,
].join(':');

return hashMessage(message);
};

export const signMessage = (privateKey: string, message: string): Signature =>
sign(privateKey, hashMessage(message));

Expand Down Expand Up @@ -186,3 +207,51 @@ export const verifyLimitOrder = (
const message = hashLimitOrder(limitOrder);
return verify(signature, message, publicKey);
};

export const signFiatTransfer = (
privateKey: string,
fiatTransfer: FiatTransfer
): Signature => {
const message = hashFiatTransfer(fiatTransfer);

return sign(privateKey, message);
};

export const verifyFiatTransfer = (
publicKey: string,
fiatTransfer: FiatTransfer,
signature: Signature
): boolean => {
const message = hashFiatTransfer(fiatTransfer);

return verify(signature, message, publicKey);
};

export const isATransferAuthorizationRequest = (
request: AuthorizationRequest
): request is Transfer => 'receiverVaultId' in request;

export const isALimitOrderAuthorizationRequest = (
request: AuthorizationRequest
): request is LimitOrder => 'vaultIdSell' in request;

export const isAFiatTransferAuthorizationRequest = (
request: AuthorizationRequest
): request is FiatTransfer => 'mangopayWalletId' in request;

export const signAuthorizationRequest = (
privateKey: string,
authorizationRequest: AuthorizationRequest
) => {
if (isATransferAuthorizationRequest(authorizationRequest)) {
return signTransfer(privateKey, authorizationRequest);
}
if (isALimitOrderAuthorizationRequest(authorizationRequest)) {
return signLimitOrder(privateKey, authorizationRequest);
}
if (isAFiatTransferAuthorizationRequest(authorizationRequest)) {
return signFiatTransfer(privateKey, authorizationRequest);
}

throw new Error('Invalid authorization request');
};
10 changes: 10 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@ export interface LimitOrder {
feeInfo?: Fee | null;
}

export interface FiatTransfer {
mangopayWalletId: string;
operationHash: string;
currency: string;
amount: number;
nonce: number;
}

export type AuthorizationRequest = LimitOrder | Transfer | FiatTransfer;

export interface Signature {
r: string;
s: string;
Expand Down

0 comments on commit e31459a

Please sign in to comment.