@actioncodes/protocol 1.0.0 → 1.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.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/actioncode.d.ts +13 -12
  3. package/dist/actioncode.d.ts.map +1 -1
  4. package/dist/actioncode.js +13 -5
  5. package/dist/adapters/base.d.ts +17 -0
  6. package/dist/adapters/base.d.ts.map +1 -1
  7. package/dist/adapters/base.js +11 -0
  8. package/dist/adapters/solana/solana.d.ts +2 -0
  9. package/dist/adapters/solana/solana.d.ts.map +1 -1
  10. package/dist/adapters/solana/solana.js +49 -2
  11. package/dist/codegen.d.ts +16 -13
  12. package/dist/codegen.d.ts.map +1 -1
  13. package/dist/codegen.js +47 -19
  14. package/dist/protocol.d.ts +14 -14
  15. package/dist/protocol.d.ts.map +1 -1
  16. package/dist/protocol.js +39 -30
  17. package/docs/README.md +1 -1
  18. package/docs/actioncode/classes/ActionCode.md +51 -65
  19. package/docs/actioncode/interfaces/ActionCodeFields.md +13 -19
  20. package/docs/actioncode/interfaces/ActionCodeMetadata.md +3 -3
  21. package/docs/actioncode/interfaces/ActionCodeTransaction.md +6 -12
  22. package/docs/actioncode/type-aliases/ActionCodeStatus.md +1 -1
  23. package/docs/adapters/base/classes/BaseChainAdapter.md +70 -8
  24. package/docs/adapters/solana/solana/classes/SolanaAdapter.md +80 -10
  25. package/docs/adapters/solana/solana/type-aliases/SolanaTransaction.md +1 -1
  26. package/docs/codegen/classes/CodeGenerator.md +65 -61
  27. package/docs/constants/type-aliases/SupportedChain.md +1 -1
  28. package/docs/constants/variables/CODE_LENGTH.md +1 -1
  29. package/docs/constants/variables/CODE_TTL.md +1 -1
  30. package/docs/constants/variables/MAX_PREFIX_LENGTH.md +1 -1
  31. package/docs/constants/variables/MIN_PREFIX_LENGTH.md +1 -1
  32. package/docs/constants/variables/PROTOCOL_CODE_PREFIX.md +1 -1
  33. package/docs/constants/variables/PROTOCOL_PREFIX.md +1 -1
  34. package/docs/constants/variables/PROTOCOL_VERSION.md +1 -1
  35. package/docs/constants/variables/SUPPORTED_CHAINS.md +1 -1
  36. package/docs/meta/classes/ProtocolMetaParser.md +6 -6
  37. package/docs/meta/interfaces/ProtocolMetaV1.md +7 -7
  38. package/docs/protocol/classes/ActionCodesProtocol.md +76 -76
  39. package/docs/protocol/interfaces/ProtocolConfig.md +7 -7
  40. package/package.json +2 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🛡️ Action Codes Protocol
2
2
 
3
- ![Coverage](https://img.shields.io/badge/coverage-99.25%25-brightgreen)
3
+ ![Coverage](https://img.shields.io/badge/coverage-98%-brightgreen)
4
4
 
5
5
  **Action Codes Protocol** enables short-lived, cryptographically verifiable action codes that authorize blockchain transactions and intents without requiring live wallet sessions.
6
6
 
@@ -1,34 +1,35 @@
1
1
  import { SUPPORTED_CHAINS } from "./constants";
2
+ import { ActionCodesProtocol } from "./protocol";
2
3
  export type ActionCodeStatus = 'pending' | 'resolved' | 'finalized' | 'expired' | 'error';
3
4
  export interface ActionCodeMetadata {
4
5
  description?: string;
5
6
  params?: Record<string, any>;
6
7
  }
7
- export interface ActionCodeTransaction<T> {
8
- transaction?: T;
8
+ export interface ActionCodeTransaction {
9
+ transaction?: string;
9
10
  txSignature?: string;
10
11
  txType?: string;
11
12
  }
12
- export interface ActionCodeFields<T> {
13
+ export interface ActionCodeFields {
13
14
  code: string;
14
15
  prefix: string;
15
16
  pubkey: string;
16
17
  timestamp: number;
17
18
  signature: string;
18
19
  chain: (typeof SUPPORTED_CHAINS)[number];
19
- transaction?: ActionCodeTransaction<T>;
20
+ transaction?: ActionCodeTransaction;
20
21
  metadata?: ActionCodeMetadata;
21
22
  expiresAt: number;
22
23
  status: ActionCodeStatus;
23
24
  }
24
- export declare class ActionCode<T> {
25
+ export declare class ActionCode {
25
26
  private fields;
26
- constructor(fields: ActionCodeFields<T>);
27
- static fromPayload<T>(input: ActionCodeFields<T>): ActionCode<T>;
28
- static fromEncoded<T>(encoded: string): ActionCode<T>;
27
+ constructor(fields: ActionCodeFields);
28
+ static fromPayload(input: ActionCodeFields): ActionCode;
29
+ static fromEncoded(encoded: string): ActionCode;
29
30
  get encoded(): string;
30
- get isValid(): boolean;
31
- get json(): ActionCodeFields<T>;
31
+ isValid(protocol: ActionCodesProtocol): boolean;
32
+ get json(): ActionCodeFields;
32
33
  /**
33
34
  * Get remaining time in milliseconds until expiration
34
35
  * @returns Remaining time in milliseconds, or 0 if expired
@@ -68,12 +69,12 @@ export declare class ActionCode<T> {
68
69
  * Get the transaction data (chain-specific)
69
70
  * @returns Transaction data or undefined
70
71
  */
71
- get transaction(): ActionCodeTransaction<T> | undefined;
72
+ get transaction(): ActionCodeTransaction | undefined;
72
73
  /**
73
74
  * Get metadata associated with this action code
74
75
  * @returns Metadata object or undefined
75
76
  */
76
- get metadata(): ActionCodeFields<T>['metadata'] | undefined;
77
+ get metadata(): ActionCodeFields['metadata'] | undefined;
77
78
  /**
78
79
  * Get a human-readable description of the action
79
80
  * @returns Description string or undefined
@@ -1 +1 @@
1
- {"version":3,"file":"actioncode.d.ts","sourceRoot":"","sources":["../src/actioncode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,CAAC,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;CAC5B;AAED,qBAAa,UAAU,CAAC,CAAC;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE/C,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAOhE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAKrD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,OAAO,CAQrB;IAED,IAAI,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE9B;IAID;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAG1B;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED;;;OAGG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,qBAAqB,CAAC,CAAC,CAAC,GAAG,SAAS,CAEtD;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS,CAE1D;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAE5C;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAO1B;IAED;;;OAGG;IACH,IAAI,mBAAmB,IAAI,MAAM,CAchC;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;CACJ"}
1
+ {"version":3,"file":"actioncode.d.ts","sourceRoot":"","sources":["../src/actioncode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;CAC5B;AAED,qBAAa,UAAU;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IAE5C,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,UAAU;IAOvD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAK/C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,OAAO,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO;IAiB/C,IAAI,IAAI,IAAI,gBAAgB,CAE3B;IAID;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAG1B;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED;;;OAGG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,qBAAqB,GAAG,SAAS,CAEnD;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,SAAS,CAEvD;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAE5C;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAO1B;IAED;;;OAGG;IACH,IAAI,mBAAmB,IAAI,MAAM,CAchC;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;CACJ"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ActionCode = void 0;
4
4
  const codegen_1 = require("./codegen");
5
+ const buffer_1 = require("buffer");
5
6
  class ActionCode {
6
7
  constructor(fields) {
7
8
  this.fields = fields;
@@ -13,14 +14,21 @@ class ActionCode {
13
14
  return new ActionCode(input);
14
15
  }
15
16
  static fromEncoded(encoded) {
16
- const decoded = JSON.parse(atob(encoded));
17
+ const decoded = JSON.parse(buffer_1.Buffer.from(encoded, 'base64').toString('utf8'));
17
18
  return ActionCode.fromPayload(decoded);
18
19
  }
19
20
  get encoded() {
20
- return btoa(JSON.stringify(this.fields));
21
- }
22
- get isValid() {
23
- return codegen_1.CodeGenerator.validateCode(this.fields.code, this.fields.pubkey, this.fields.timestamp, this.fields.signature, this.fields.prefix);
21
+ return buffer_1.Buffer.from(JSON.stringify(this.fields), 'utf8').toString('base64');
22
+ }
23
+ isValid(protocol) {
24
+ if (this.expired)
25
+ return false;
26
+ const adapter = protocol.getChainAdapter(this.chain);
27
+ if (!adapter)
28
+ throw new Error(`Chain adapter not found for chain ${this.chain}`);
29
+ const isSignatureValid = adapter.verifyCodeSignature(this);
30
+ const isCodeValid = codegen_1.CodeGenerator.validateCode(this.fields.code, this.fields.pubkey, this.fields.timestamp, this.fields.prefix);
31
+ return isSignatureValid && isCodeValid;
24
32
  }
25
33
  get json() {
26
34
  return this.fields;
@@ -1,3 +1,4 @@
1
+ import { ActionCode } from '../actioncode';
1
2
  import { ProtocolMetaV1 } from '../meta';
2
3
  /**
3
4
  * Base adapter class for chain-specific protocol meta operations
@@ -48,5 +49,21 @@ export declare abstract class BaseChainAdapter<T = any> {
48
49
  * @returns True if transaction integrity is valid
49
50
  */
50
51
  protected abstract validateTransactionIntegrity(tx: T, meta: ProtocolMetaV1): boolean;
52
+ /**
53
+ * Get the code signature message
54
+ * @param code - The code to sign
55
+ * @param timestamp - The timestamp of the code
56
+ * @param prefix - The prefix of the code
57
+ * @returns The code signature message
58
+ */
59
+ getCodeSignatureMessage(code: string, timestamp: number, prefix?: string): string;
60
+ /**
61
+ * Verify the code signature
62
+ * This is specific to the chain and should be implemented by the concrete adapter
63
+ * It will be used to verify the code signature for the action code if the right wallet is used to sign the code
64
+ * @param actionCode - The action code to verify
65
+ * @returns True if the code signature is valid
66
+ */
67
+ abstract verifyCodeSignature(actionCode: ActionCode): boolean;
51
68
  }
52
69
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;;GAGG;AACH,8BAAsB,gBAAgB,CAAC,CAAC,GAAG,GAAG;IAC1C,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,GAAG;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,cAAc,GAAG,IAAI;IAE7C;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO;IAEjF;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAE3D;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,MAAkB,GAAG,OAAO;IA8B1F;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO;CACxF"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;;GAGG;AACH,8BAAsB,gBAAgB,CAAC,CAAC,GAAG,GAAG;IAC1C,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,GAAG;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,cAAc,GAAG,IAAI;IAE7C;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO;IAEjF;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAE3D;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,MAAkB,GAAG,OAAO;IA8B1F;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO;IAErF;;;;;;OAMG;IACH,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAA6B,GAAG,MAAM;IAIvG;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;CAChE"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseChainAdapter = void 0;
4
+ const constants_1 = require("../constants");
4
5
  /**
5
6
  * Base adapter class for chain-specific protocol meta operations
6
7
  * @template T - Chain-specific transaction type
@@ -37,5 +38,15 @@ class BaseChainAdapter {
37
38
  // Additional chain-specific validation
38
39
  return this.validateTransactionIntegrity(tx, meta);
39
40
  }
41
+ /**
42
+ * Get the code signature message
43
+ * @param code - The code to sign
44
+ * @param timestamp - The timestamp of the code
45
+ * @param prefix - The prefix of the code
46
+ * @returns The code signature message
47
+ */
48
+ getCodeSignatureMessage(code, timestamp, prefix = constants_1.PROTOCOL_CODE_PREFIX) {
49
+ return `${prefix}:${code}:${timestamp}`;
50
+ }
40
51
  }
41
52
  exports.BaseChainAdapter = BaseChainAdapter;
@@ -1,6 +1,7 @@
1
1
  import { Transaction, TransactionInstruction, VersionedTransaction } from '@solana/web3.js';
2
2
  import { ProtocolMetaV1 } from '../../meta';
3
3
  import { BaseChainAdapter } from '../base';
4
+ import { ActionCode } from '../../actioncode';
4
5
  /**
5
6
  * Solana transaction type union
6
7
  */
@@ -80,5 +81,6 @@ export declare class SolanaAdapter extends BaseChainAdapter<SolanaTransaction> {
80
81
  * @returns True if transaction is valid
81
82
  */
82
83
  validateFromBase64(base64String: string, authorities: string[], expectedPrefix?: string): boolean;
84
+ verifyCodeSignature(actionCode: ActionCode): boolean;
83
85
  }
84
86
  //# sourceMappingURL=solana.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../src/adapters/solana/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EAEvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEnE;;;GAGG;AACH,qBAAa,aAAc,SAAQ,gBAAgB,CAAC,iBAAiB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAmB;IAE1D,QAAQ,CAAC,KAAK,YAAY;IAE1B;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,sBAAsB;IAKpD;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,iBAAiB,GAAG,cAAc,GAAG,IAAI;IAWpD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,MAAkB,GAAG,OAAO;IAInG;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAWlE;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqB/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAMhC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAenC;;;;;OAKG;IACH,SAAS,CAAC,4BAA4B,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO;IAqB5F;;;;OAIG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAgB7D;;;;;;OAMG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,MAAkB,GAAG,OAAO;CAe/G"}
1
+ {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../src/adapters/solana/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EAGvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEnE;;;GAGG;AACH,qBAAa,aAAc,SAAQ,gBAAgB,CAAC,iBAAiB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAmB;IAE1D,QAAQ,CAAC,KAAK,YAAY;IAE1B;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,sBAAsB;IAKpD;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,iBAAiB,GAAG,cAAc,GAAG,IAAI;IAWpD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,MAAkB,GAAG,OAAO;IAInG;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAWlE;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqB/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAMhC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAenC;;;;;OAKG;IACH,SAAS,CAAC,4BAA4B,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO;IAqB5F;;;;OAIG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAgB7D;;;;;;OAMG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,MAAkB,GAAG,OAAO;IAiBrG,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;CAY9D"}
@@ -1,10 +1,45 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.SolanaAdapter = void 0;
4
37
  const web3_js_1 = require("@solana/web3.js");
5
38
  const spl_memo_1 = require("@solana/spl-memo");
6
39
  const meta_1 = require("../../meta");
7
40
  const base_1 = require("../base");
41
+ const nacl = __importStar(require("tweetnacl"));
42
+ const buffer_1 = require("buffer");
8
43
  /**
9
44
  * Simple Solana adapter for protocol meta operations
10
45
  * Supports both legacy and versioned transactions
@@ -179,7 +214,7 @@ class SolanaAdapter extends base_1.BaseChainAdapter {
179
214
  */
180
215
  decodeFromBase64(base64String) {
181
216
  try {
182
- const buffer = Uint8Array.from(atob(base64String), c => c.charCodeAt(0));
217
+ const buffer = buffer_1.Buffer.from(base64String, 'base64');
183
218
  // Try legacy first, then versioned
184
219
  try {
185
220
  const transaction = web3_js_1.Transaction.from(buffer);
@@ -203,7 +238,7 @@ class SolanaAdapter extends base_1.BaseChainAdapter {
203
238
  */
204
239
  validateFromBase64(base64String, authorities, expectedPrefix = 'DEFAULT') {
205
240
  try {
206
- const buffer = Uint8Array.from(atob(base64String), c => c.charCodeAt(0));
241
+ const buffer = buffer_1.Buffer.from(base64String, 'base64');
207
242
  // Try legacy first, then versioned
208
243
  try {
209
244
  const transaction = web3_js_1.Transaction.from(buffer);
@@ -218,6 +253,18 @@ class SolanaAdapter extends base_1.BaseChainAdapter {
218
253
  return false;
219
254
  }
220
255
  }
256
+ verifyCodeSignature(actionCode) {
257
+ try {
258
+ const message = this.getCodeSignatureMessage(actionCode.code, actionCode.timestamp, actionCode.prefix);
259
+ const messageBytes = new TextEncoder().encode(message);
260
+ const pubkeyBytes = new web3_js_1.PublicKey(actionCode.pubkey).toBytes();
261
+ const sigBytes = buffer_1.Buffer.from(actionCode.signature, 'base64');
262
+ return nacl.sign.detached.verify(messageBytes, sigBytes, pubkeyBytes);
263
+ }
264
+ catch (error) {
265
+ return false;
266
+ }
267
+ }
221
268
  }
222
269
  exports.SolanaAdapter = SolanaAdapter;
223
270
  SolanaAdapter.MEMO_PROGRAM_ID = spl_memo_1.MEMO_PROGRAM_ID;
package/dist/codegen.d.ts CHANGED
@@ -9,6 +9,18 @@ export declare class CodeGenerator {
9
9
  * @returns True if prefix is valid, false otherwise
10
10
  */
11
11
  static validatePrefix(prefix: string): boolean;
12
+ /**
13
+ * Validate generated code format
14
+ * @param code - The code to validate
15
+ * @returns True if code is valid, false otherwise
16
+ */
17
+ static validateCodeFormat(code: string): boolean;
18
+ /**
19
+ * Validate that a code without prefix is exactly 8 digits and only numbers
20
+ * @param code - The code to validate
21
+ * @returns True if code is valid, false otherwise
22
+ */
23
+ static validateCodeDigits(code: string): boolean;
12
24
  /**
13
25
  * Normalize prefix - convert "DEFAULT" to empty string, validate others
14
26
  * @param prefix - The prefix to normalize
@@ -19,12 +31,12 @@ export declare class CodeGenerator {
19
31
  /**
20
32
  * Generate a deterministic 8-digit code based on public key, prefix, and timestamp
21
33
  * @param pubkey - Solana wallet public key (base58)
22
- * @param signature - User's signature string
23
34
  * @param prefix - Optional namespace prefix (default: "DEFAULT")
24
35
  * @param timestamp - UNIX timestamp in milliseconds (defaults to now)
25
36
  * @returns Object containing code, issuedAt, and expiresAt timestamps
37
+ * @throws Error if generated code is invalid
26
38
  */
27
- static generateCode(pubkey: string, signature: string, prefix?: string, timestamp?: number): {
39
+ static generateCode(pubkey: string, prefix?: string, timestamp?: number): {
28
40
  code: string;
29
41
  issuedAt: number;
30
42
  expiresAt: number;
@@ -37,32 +49,23 @@ export declare class CodeGenerator {
37
49
  * @returns Full SHA-256 hash string
38
50
  */
39
51
  static deriveCodeHash(pubkey: string, prefix?: string, timestamp?: number): string;
40
- /**
41
- * Generate the message that should be signed for code verification
42
- * @param code - The generated 8-digit code
43
- * @param timestamp - UNIX timestamp in milliseconds
44
- * @returns Message string in format "actioncodes:<code>:<timestamp>"
45
- */
46
- static generateCodeSignatureMessage(code: string, timestamp: number): string;
47
52
  /**
48
53
  * Get the expected code for a given public key and timestamp
49
54
  * @param pubkey - Solana wallet public key (base58)
50
55
  * @param timestamp - UNIX timestamp in milliseconds
51
- * @param signature - User's signature string
52
56
  * @param prefix - Optional namespace prefix (default: "DEFAULT")
53
57
  * @returns 8-digit numeric string
54
58
  */
55
- static getExpectedCode(pubkey: string, timestamp: number, signature: string, prefix?: string): string;
59
+ static getExpectedCode(pubkey: string, timestamp: number, prefix?: string): string;
56
60
  /**
57
61
  * Validate if a code matches the expected code for a given public key and timestamp
58
62
  * @param code - The code to validate
59
63
  * @param pubkey - Solana wallet public key (base58)
60
64
  * @param timestamp - UNIX timestamp in milliseconds
61
- * @param signature - User's signature string
62
65
  * @param prefix - Optional namespace prefix (default: "DEFAULT")
63
66
  * @returns True if code matches expected code and timestamp is valid
64
67
  */
65
- static validateCode(code: string, pubkey: string, timestamp: number, signature: string, prefix?: string): boolean;
68
+ static validateCode(code: string, pubkey: string, timestamp: number, prefix?: string): boolean;
66
69
  /**
67
70
  * Check if a timestamp falls within a valid time window
68
71
  * @param timestamp - UNIX timestamp in milliseconds
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAGA,qBAAa,aAAa;IACtB,MAAM,CAAC,cAAc,SAAY;IACjC,MAAM,CAAC,WAAW,SAAe;IACjC,MAAM,CAAC,iBAAiB,SAAqB;IAC7C,MAAM,CAAC,iBAAiB,SAAqB;IAE7C;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAM9C;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQ9C;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAkB,EAC1B,SAAS,GAAE,MAAmB,GAC/B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAmBxD;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAkB,EAC1B,SAAS,CAAC,EAAE,MAAM,GACnB,MAAM;IAQT;;;;;OAKG;IACH,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAI5E;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAkB,GAC3B,MAAM;IAIT;;;;;;;;OAQG;IACH,MAAM,CAAC,YAAY,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAkB,GAC3B,OAAO;IAOV;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAGtD"}
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAGA,qBAAa,aAAa;IACtB,MAAM,CAAC,cAAc,SAAY;IACjC,MAAM,CAAC,WAAW,SAAe;IACjC,MAAM,CAAC,iBAAiB,SAAqB;IAC7C,MAAM,CAAC,iBAAiB,SAAqB;IAE7C;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAM9C;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMhD;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMhD;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQ9C;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CACf,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAkB,EAC1B,SAAS,GAAE,MAAmB,GAC/B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IA8BxD;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAkB,EAC1B,SAAS,CAAC,EAAE,MAAM,GACnB,MAAM;IAQT;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAkB,GAC3B,MAAM;IAIT;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAkB,GAC3B,OAAO;IAgBV;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAGtD"}
package/dist/codegen.js CHANGED
@@ -16,6 +16,30 @@ class CodeGenerator {
16
16
  return false;
17
17
  return /^[A-Za-z]+$/.test(prefix);
18
18
  }
19
+ /**
20
+ * Validate generated code format
21
+ * @param code - The code to validate
22
+ * @returns True if code is valid, false otherwise
23
+ */
24
+ static validateCodeFormat(code) {
25
+ if (!code || typeof code !== 'string')
26
+ return false;
27
+ if (code.length !== this.CODE_DIGITS)
28
+ return false;
29
+ return /^\d+$/.test(code);
30
+ }
31
+ /**
32
+ * Validate that a code without prefix is exactly 8 digits and only numbers
33
+ * @param code - The code to validate
34
+ * @returns True if code is valid, false otherwise
35
+ */
36
+ static validateCodeDigits(code) {
37
+ if (!code || typeof code !== 'string')
38
+ return false;
39
+ if (code.length !== constants_1.CODE_LENGTH)
40
+ return false;
41
+ return /^[0-9]{8}$/.test(code);
42
+ }
19
43
  /**
20
44
  * Normalize prefix - convert "DEFAULT" to empty string, validate others
21
45
  * @param prefix - The prefix to normalize
@@ -33,22 +57,30 @@ class CodeGenerator {
33
57
  /**
34
58
  * Generate a deterministic 8-digit code based on public key, prefix, and timestamp
35
59
  * @param pubkey - Solana wallet public key (base58)
36
- * @param signature - User's signature string
37
60
  * @param prefix - Optional namespace prefix (default: "DEFAULT")
38
61
  * @param timestamp - UNIX timestamp in milliseconds (defaults to now)
39
62
  * @returns Object containing code, issuedAt, and expiresAt timestamps
63
+ * @throws Error if generated code is invalid
40
64
  */
41
- static generateCode(pubkey, signature, prefix = "DEFAULT", timestamp = Date.now()) {
65
+ static generateCode(pubkey, prefix = "DEFAULT", timestamp = Date.now()) {
42
66
  const normalizedPrefix = this.normalizePrefix(prefix);
43
- const input = `${normalizedPrefix}:${pubkey}:${timestamp}:${signature}`;
67
+ const input = `${normalizedPrefix}:${pubkey}:${timestamp}`;
44
68
  const hash = (0, js_sha256_1.sha256)(input);
45
69
  const raw = parseInt(hash.slice(0, 16), 16);
46
70
  const mod = 10 ** this.CODE_DIGITS;
47
71
  const code = raw % mod;
48
72
  const issuedAt = timestamp;
49
73
  const expiresAt = issuedAt + this.TIME_WINDOW_MS;
74
+ const generatedCode = code.toString().padStart(this.CODE_DIGITS, "0");
75
+ // Validate the generated code
76
+ if (!this.validateCodeFormat(generatedCode)) {
77
+ throw new Error(`Generated code validation failed: ${generatedCode}`);
78
+ }
79
+ if (!this.validateCodeDigits(generatedCode)) {
80
+ throw new Error(`Generated code must be exactly 8 digits: ${generatedCode}`);
81
+ }
50
82
  return {
51
- code: code.toString().padStart(this.CODE_DIGITS, "0"),
83
+ code: generatedCode,
52
84
  issuedAt,
53
85
  expiresAt
54
86
  };
@@ -67,37 +99,33 @@ class CodeGenerator {
67
99
  const hash = (0, js_sha256_1.sha256)(input);
68
100
  return hash;
69
101
  }
70
- /**
71
- * Generate the message that should be signed for code verification
72
- * @param code - The generated 8-digit code
73
- * @param timestamp - UNIX timestamp in milliseconds
74
- * @returns Message string in format "actioncodes:<code>:<timestamp>"
75
- */
76
- static generateCodeSignatureMessage(code, timestamp) {
77
- return `${constants_1.PROTOCOL_PREFIX}:${code}:${timestamp}`;
78
- }
79
102
  /**
80
103
  * Get the expected code for a given public key and timestamp
81
104
  * @param pubkey - Solana wallet public key (base58)
82
105
  * @param timestamp - UNIX timestamp in milliseconds
83
- * @param signature - User's signature string
84
106
  * @param prefix - Optional namespace prefix (default: "DEFAULT")
85
107
  * @returns 8-digit numeric string
86
108
  */
87
- static getExpectedCode(pubkey, timestamp, signature, prefix = "DEFAULT") {
88
- return this.generateCode(pubkey, signature, prefix, timestamp).code;
109
+ static getExpectedCode(pubkey, timestamp, prefix = "DEFAULT") {
110
+ return this.generateCode(pubkey, prefix, timestamp).code;
89
111
  }
90
112
  /**
91
113
  * Validate if a code matches the expected code for a given public key and timestamp
92
114
  * @param code - The code to validate
93
115
  * @param pubkey - Solana wallet public key (base58)
94
116
  * @param timestamp - UNIX timestamp in milliseconds
95
- * @param signature - User's signature string
96
117
  * @param prefix - Optional namespace prefix (default: "DEFAULT")
97
118
  * @returns True if code matches expected code and timestamp is valid
98
119
  */
99
- static validateCode(code, pubkey, timestamp, signature, prefix = "DEFAULT") {
100
- const expectedCode = this.getExpectedCode(pubkey, timestamp, signature, prefix);
120
+ static validateCode(code, pubkey, timestamp, prefix = "DEFAULT") {
121
+ // First validate the code format
122
+ if (!this.validateCodeFormat(code)) {
123
+ return false;
124
+ }
125
+ if (!this.validateCodeDigits(code)) {
126
+ return false;
127
+ }
128
+ const expectedCode = this.getExpectedCode(pubkey, timestamp, prefix);
101
129
  const now = Date.now();
102
130
  const isTimeValid = timestamp >= 0 && timestamp <= now && now <= timestamp + this.TIME_WINDOW_MS;
103
131
  return code === expectedCode && isTimeValid;
@@ -51,22 +51,22 @@ export declare class ActionCodesProtocol {
51
51
  * @returns Chain adapter or undefined
52
52
  */
53
53
  getChainAdapter<T = any>(chain: string): BaseChainAdapter<T> | undefined;
54
- /**
55
- * Generate an action code for a specific chain
56
- * @param pubkey - User's public key
57
- * @param signature - User's signature
58
- * @param chain - Target chain
59
- * @param prefix - Optional prefix (defaults to config defaultPrefix)
60
- * @param timestamp - Optional timestamp (defaults to now)
61
- * @returns ActionCode object
62
- */
63
- generateActionCode(pubkey: string, signature: string, chain: SupportedChain, prefix?: string, timestamp?: number): ActionCode<string>;
64
54
  /**
65
55
  * Validate an action code
66
56
  * @param actionCode - ActionCode to validate
67
57
  * @returns True if valid
68
58
  */
69
- validateActionCode(actionCode: ActionCode<string>): boolean;
59
+ validateActionCode(actionCode: ActionCode): boolean;
60
+ /**
61
+ * Create an action code
62
+ * @param pubkey - Wallet public key
63
+ * @param signFn - Chain-specific signing function (e.g.wallet.signMessage)
64
+ * @param chain - Target blockchain
65
+ * @param prefix - Optional code prefix
66
+ * @param timestamp - Optional timestamp
67
+ * @returns Promise resolving to a complete ActionCode object
68
+ */
69
+ createActionCode(pubkey: string, signFn: (message: string) => Promise<string>, chain: SupportedChain, prefix?: string, timestamp?: number): Promise<ActionCode>;
70
70
  /**
71
71
  * Attach a transaction to an action code
72
72
  * @param actionCode - ActionCode to attach transaction to
@@ -74,14 +74,14 @@ export declare class ActionCodesProtocol {
74
74
  * @param txType - Optional transaction type
75
75
  * @returns Updated ActionCode
76
76
  */
77
- attachTransaction(actionCode: ActionCode<string>, transaction: string, txType?: string): ActionCode<string>;
77
+ attachTransaction(actionCode: ActionCode, transaction: string, txType?: string): ActionCode;
78
78
  /**
79
79
  * Finalize an action code with transaction signature
80
80
  * @param actionCode - ActionCode to finalize
81
81
  * @param txSignature - Transaction signature
82
82
  * @returns Updated ActionCode
83
83
  */
84
- finalizeActionCode(actionCode: ActionCode<string>, txSignature: string): ActionCode<string>;
84
+ finalizeActionCode(actionCode: ActionCode, txSignature: string): ActionCode;
85
85
  /**
86
86
  * Create protocol meta for a transaction
87
87
  * @param actionCode - ActionCode to create meta for
@@ -89,7 +89,7 @@ export declare class ActionCodesProtocol {
89
89
  * @param params - Optional parameters
90
90
  * @returns ProtocolMetaV1 object
91
91
  */
92
- createProtocolMeta(actionCode: ActionCode<string>, issuer?: string, params?: string): ProtocolMetaV1;
92
+ createProtocolMeta(actionCode: ActionCode, issuer?: string, params?: string): ProtocolMetaV1;
93
93
  /**
94
94
  * Encode protocol meta for a specific chain
95
95
  * @param meta - ProtocolMetaV1 object
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
package/dist/protocol.js CHANGED
@@ -54,36 +54,6 @@ class ActionCodesProtocol {
54
54
  getChainAdapter(chain) {
55
55
  return this.adapters.get(chain);
56
56
  }
57
- /**
58
- * Generate an action code for a specific chain
59
- * @param pubkey - User's public key
60
- * @param signature - User's signature
61
- * @param chain - Target chain
62
- * @param prefix - Optional prefix (defaults to config defaultPrefix)
63
- * @param timestamp - Optional timestamp (defaults to now)
64
- * @returns ActionCode object
65
- */
66
- generateActionCode(pubkey, signature, chain, prefix, timestamp) {
67
- if (!this.isChainSupported(chain)) {
68
- throw new Error(`Chain '${chain}' is not supported. Registered chains: ${this.getRegisteredChains().join(', ')}`);
69
- }
70
- const normalizedPrefix = prefix || this.config.defaultPrefix;
71
- const ts = timestamp || Date.now();
72
- // Generate code using CodeGenerator
73
- const { code, issuedAt, expiresAt } = codegen_1.CodeGenerator.generateCode(pubkey, signature, normalizedPrefix, ts);
74
- // Create ActionCode object
75
- const actionCodeFields = {
76
- code,
77
- prefix: normalizedPrefix,
78
- pubkey,
79
- timestamp: issuedAt,
80
- signature,
81
- chain,
82
- expiresAt,
83
- status: 'pending'
84
- };
85
- return actioncode_1.ActionCode.fromPayload(actionCodeFields);
86
- }
87
57
  /**
88
58
  * Validate an action code
89
59
  * @param actionCode - ActionCode to validate
@@ -101,6 +71,45 @@ class ActionCodesProtocol {
101
71
  // Chain-specific validation would be done when attaching transactions
102
72
  return true;
103
73
  }
74
+ /**
75
+ * Create an action code
76
+ * @param pubkey - Wallet public key
77
+ * @param signFn - Chain-specific signing function (e.g.wallet.signMessage)
78
+ * @param chain - Target blockchain
79
+ * @param prefix - Optional code prefix
80
+ * @param timestamp - Optional timestamp
81
+ * @returns Promise resolving to a complete ActionCode object
82
+ */
83
+ async createActionCode(pubkey, signFn, chain, prefix = this.config.defaultPrefix, timestamp) {
84
+ if (!this.isChainSupported(chain)) {
85
+ throw new Error(`Chain '${chain}' is not supported. Registered chains: ${this.getRegisteredChains().join(', ')}`);
86
+ }
87
+ const adapter = this.getChainAdapter(chain);
88
+ if (!adapter) {
89
+ throw new Error(`No adapter found for chain '${chain}'`);
90
+ }
91
+ const ts = timestamp || Date.now();
92
+ const { code, issuedAt, expiresAt } = codegen_1.CodeGenerator.generateCode(pubkey, prefix, ts);
93
+ const message = adapter.getCodeSignatureMessage(code, issuedAt, prefix);
94
+ const signature = await signFn(message);
95
+ const actionCode = actioncode_1.ActionCode.fromPayload({
96
+ code,
97
+ pubkey,
98
+ signature,
99
+ timestamp: issuedAt,
100
+ expiresAt,
101
+ prefix,
102
+ chain,
103
+ status: 'pending'
104
+ });
105
+ if (!this.validateActionCode(actionCode)) {
106
+ throw new Error('Invalid action code');
107
+ }
108
+ if (!adapter.verifyCodeSignature(actionCode)) {
109
+ throw new Error('Invalid signature for generated code');
110
+ }
111
+ return actionCode;
112
+ }
104
113
  /**
105
114
  * Attach a transaction to an action code
106
115
  * @param actionCode - ActionCode to attach transaction to
package/docs/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # 🛡️ Action Codes Protocol
6
6
 
7
- ![Coverage](https://img.shields.io/badge/coverage-99.25%25-brightgreen)
7
+ ![Coverage](https://img.shields.io/badge/coverage-98%-brightgreen)
8
8
 
9
9
  **Action Codes Protocol** enables short-lived, cryptographically verifiable action codes that authorize blockchain transactions and intents without requiring live wallet sessions.
10
10