@ledgerhq/coin-canton 0.5.0-nightly.1 → 0.5.0-nightly.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 (166) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.unimportedrc.json +12 -4
  3. package/CHANGELOG.md +21 -0
  4. package/lib/api/getBalance.integ.test.js +1 -1
  5. package/lib/api/getBalance.integ.test.js.map +1 -1
  6. package/lib/api/index.d.ts.map +1 -1
  7. package/lib/api/index.js +11 -8
  8. package/lib/api/index.js.map +1 -1
  9. package/lib/bridge/createTransaction.test.js +1 -1
  10. package/lib/bridge/createTransaction.test.js.map +1 -1
  11. package/lib/bridge/index.d.ts +3 -3
  12. package/lib/bridge/index.d.ts.map +1 -1
  13. package/lib/bridge/index.js +9 -1
  14. package/lib/bridge/index.js.map +1 -1
  15. package/lib/bridge/onboard.d.ts +10 -0
  16. package/lib/bridge/onboard.d.ts.map +1 -0
  17. package/lib/bridge/onboard.integ.test.d.ts +2 -0
  18. package/lib/bridge/onboard.integ.test.d.ts.map +1 -0
  19. package/lib/bridge/onboard.integ.test.js +156 -0
  20. package/lib/bridge/onboard.integ.test.js.map +1 -0
  21. package/lib/bridge/onboard.js +139 -0
  22. package/lib/bridge/onboard.js.map +1 -0
  23. package/lib/bridge/prepareTransaction.d.ts.map +1 -1
  24. package/lib/bridge/prepareTransaction.js +5 -7
  25. package/lib/bridge/prepareTransaction.js.map +1 -1
  26. package/lib/bridge/signOperation.d.ts.map +1 -1
  27. package/lib/bridge/signOperation.js +2 -1
  28. package/lib/bridge/signOperation.js.map +1 -1
  29. package/lib/bridge/sync.d.ts.map +1 -1
  30. package/lib/bridge/sync.integ.test.d.ts +2 -0
  31. package/lib/bridge/sync.integ.test.d.ts.map +1 -0
  32. package/lib/bridge/sync.integ.test.js +175 -0
  33. package/lib/bridge/sync.integ.test.js.map +1 -0
  34. package/lib/bridge/sync.js +39 -36
  35. package/lib/bridge/sync.js.map +1 -1
  36. package/lib/bridge/updateTransaction.d.ts.map +1 -1
  37. package/lib/bridge/updateTransaction.js +0 -4
  38. package/lib/bridge/updateTransaction.js.map +1 -1
  39. package/lib/common-logic/history/listOperations.d.ts.map +1 -1
  40. package/lib/common-logic/history/listOperations.js +19 -31
  41. package/lib/common-logic/history/listOperations.js.map +1 -1
  42. package/lib/common-logic/transaction/craftTransaction.d.ts +4 -3
  43. package/lib/common-logic/transaction/craftTransaction.d.ts.map +1 -1
  44. package/lib/common-logic/transaction/craftTransaction.js +10 -12
  45. package/lib/common-logic/transaction/craftTransaction.js.map +1 -1
  46. package/lib/network/gateway.d.ts +194 -3
  47. package/lib/network/gateway.d.ts.map +1 -1
  48. package/lib/network/gateway.integ.test.js +121 -11
  49. package/lib/network/gateway.integ.test.js.map +1 -1
  50. package/lib/network/gateway.js +96 -18
  51. package/lib/network/gateway.js.map +1 -1
  52. package/lib/network/node.d.ts +2 -2
  53. package/lib/network/node.d.ts.map +1 -1
  54. package/lib/network/node.js.map +1 -1
  55. package/lib/network/types.d.ts +1 -1
  56. package/lib/network/types.d.ts.map +1 -1
  57. package/lib/signer/getAddress.d.ts.map +1 -1
  58. package/lib/signer/getAddress.js +2 -2
  59. package/lib/signer/getAddress.js.map +1 -1
  60. package/lib/test/cantonTestUtils.d.ts +33 -0
  61. package/lib/test/cantonTestUtils.d.ts.map +1 -0
  62. package/lib/test/cantonTestUtils.js +159 -0
  63. package/lib/test/cantonTestUtils.js.map +1 -0
  64. package/lib/types/bridge.d.ts +7 -1
  65. package/lib/types/bridge.d.ts.map +1 -1
  66. package/lib/types/index.d.ts +1 -10
  67. package/lib/types/index.d.ts.map +1 -1
  68. package/lib/types/index.js +1 -0
  69. package/lib/types/index.js.map +1 -1
  70. package/lib/types/onboard.d.ts +55 -0
  71. package/lib/types/onboard.d.ts.map +1 -0
  72. package/lib/types/onboard.js +22 -0
  73. package/lib/types/onboard.js.map +1 -0
  74. package/lib-es/api/getBalance.integ.test.js +1 -1
  75. package/lib-es/api/getBalance.integ.test.js.map +1 -1
  76. package/lib-es/api/index.d.ts.map +1 -1
  77. package/lib-es/api/index.js +12 -9
  78. package/lib-es/api/index.js.map +1 -1
  79. package/lib-es/bridge/createTransaction.test.js +1 -1
  80. package/lib-es/bridge/createTransaction.test.js.map +1 -1
  81. package/lib-es/bridge/index.d.ts +3 -3
  82. package/lib-es/bridge/index.d.ts.map +1 -1
  83. package/lib-es/bridge/index.js +9 -1
  84. package/lib-es/bridge/index.js.map +1 -1
  85. package/lib-es/bridge/onboard.d.ts +10 -0
  86. package/lib-es/bridge/onboard.d.ts.map +1 -0
  87. package/lib-es/bridge/onboard.integ.test.d.ts +2 -0
  88. package/lib-es/bridge/onboard.integ.test.d.ts.map +1 -0
  89. package/lib-es/bridge/onboard.integ.test.js +151 -0
  90. package/lib-es/bridge/onboard.integ.test.js.map +1 -0
  91. package/lib-es/bridge/onboard.js +133 -0
  92. package/lib-es/bridge/onboard.js.map +1 -0
  93. package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
  94. package/lib-es/bridge/prepareTransaction.js +6 -8
  95. package/lib-es/bridge/prepareTransaction.js.map +1 -1
  96. package/lib-es/bridge/signOperation.d.ts.map +1 -1
  97. package/lib-es/bridge/signOperation.js +2 -1
  98. package/lib-es/bridge/signOperation.js.map +1 -1
  99. package/lib-es/bridge/sync.d.ts.map +1 -1
  100. package/lib-es/bridge/sync.integ.test.d.ts +2 -0
  101. package/lib-es/bridge/sync.integ.test.d.ts.map +1 -0
  102. package/lib-es/bridge/sync.integ.test.js +137 -0
  103. package/lib-es/bridge/sync.integ.test.js.map +1 -0
  104. package/lib-es/bridge/sync.js +38 -35
  105. package/lib-es/bridge/sync.js.map +1 -1
  106. package/lib-es/bridge/updateTransaction.d.ts.map +1 -1
  107. package/lib-es/bridge/updateTransaction.js +0 -4
  108. package/lib-es/bridge/updateTransaction.js.map +1 -1
  109. package/lib-es/common-logic/history/listOperations.d.ts.map +1 -1
  110. package/lib-es/common-logic/history/listOperations.js +20 -29
  111. package/lib-es/common-logic/history/listOperations.js.map +1 -1
  112. package/lib-es/common-logic/transaction/craftTransaction.d.ts +4 -3
  113. package/lib-es/common-logic/transaction/craftTransaction.d.ts.map +1 -1
  114. package/lib-es/common-logic/transaction/craftTransaction.js +10 -12
  115. package/lib-es/common-logic/transaction/craftTransaction.js.map +1 -1
  116. package/lib-es/network/gateway.d.ts +194 -3
  117. package/lib-es/network/gateway.d.ts.map +1 -1
  118. package/lib-es/network/gateway.integ.test.js +122 -12
  119. package/lib-es/network/gateway.integ.test.js.map +1 -1
  120. package/lib-es/network/gateway.js +90 -17
  121. package/lib-es/network/gateway.js.map +1 -1
  122. package/lib-es/network/node.d.ts +2 -2
  123. package/lib-es/network/node.d.ts.map +1 -1
  124. package/lib-es/network/node.js.map +1 -1
  125. package/lib-es/network/types.d.ts +1 -1
  126. package/lib-es/network/types.d.ts.map +1 -1
  127. package/lib-es/signer/getAddress.d.ts.map +1 -1
  128. package/lib-es/signer/getAddress.js +2 -2
  129. package/lib-es/signer/getAddress.js.map +1 -1
  130. package/lib-es/test/cantonTestUtils.d.ts +33 -0
  131. package/lib-es/test/cantonTestUtils.d.ts.map +1 -0
  132. package/lib-es/test/cantonTestUtils.js +151 -0
  133. package/lib-es/test/cantonTestUtils.js.map +1 -0
  134. package/lib-es/types/bridge.d.ts +7 -1
  135. package/lib-es/types/bridge.d.ts.map +1 -1
  136. package/lib-es/types/index.d.ts +1 -10
  137. package/lib-es/types/index.d.ts.map +1 -1
  138. package/lib-es/types/index.js +1 -0
  139. package/lib-es/types/index.js.map +1 -1
  140. package/lib-es/types/onboard.d.ts +55 -0
  141. package/lib-es/types/onboard.d.ts.map +1 -0
  142. package/lib-es/types/onboard.js +19 -0
  143. package/lib-es/types/onboard.js.map +1 -0
  144. package/package.json +6 -6
  145. package/src/api/getBalance.integ.test.ts +1 -2
  146. package/src/api/index.ts +33 -26
  147. package/src/bridge/createTransaction.test.ts +1 -1
  148. package/src/bridge/index.ts +14 -4
  149. package/src/bridge/onboard.integ.test.ts +219 -0
  150. package/src/bridge/onboard.ts +220 -0
  151. package/src/bridge/prepareTransaction.ts +6 -15
  152. package/src/bridge/signOperation.ts +3 -2
  153. package/src/bridge/sync.integ.test.ts +180 -0
  154. package/src/bridge/sync.ts +57 -49
  155. package/src/bridge/updateTransaction.ts +0 -5
  156. package/src/common-logic/history/listOperations.ts +20 -31
  157. package/src/common-logic/transaction/craftTransaction.ts +13 -17
  158. package/src/network/gateway.integ.test.ts +156 -17
  159. package/src/network/gateway.ts +333 -26
  160. package/src/network/node.ts +3 -3
  161. package/src/network/types.ts +1 -1
  162. package/src/signer/getAddress.ts +3 -5
  163. package/src/test/cantonTestUtils.ts +181 -0
  164. package/src/types/bridge.ts +20 -0
  165. package/src/types/index.ts +1 -11
  166. package/src/types/onboard.ts +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cantonTestUtils.js","sourceRoot":"","sources":["../../src/test/cantonTestUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAU5B;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,yEAAyE;IACzE,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAW,CAAC;IACpF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,iFAAiF;IACjF,iGAAiG;IACjG,MAAM,8BAA8B,GAAG,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC3C,YAAY,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;IAE7D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEpC,6DAA6D;IAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,OAAO;QACL,YAAY,EAAE,oCAAoC;QAClD,aAAa,EAAE,8CAA8C;QAC7D,aAAa,EAAE,oBAAoB;QACnC,WAAW,EAAE,uDAAuD;QAEpE;;WAEG;QACH,IAAI,EAAE,CAAC,OAAe,EAAU,EAAE;YAChC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAC5C,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YAC/D,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,YAAoB,EACpB,YAAoB,EACpB,cAAsB;IAEtB,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5F,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5F,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;YACtD,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YACzB,CAAC,CAAC,cAAc,CAAC;QAEnB,MAAM,OAAO,GAAQ;YACnB,eAAe,EAAE,cAAc,CAAC,MAAM;YACtC,eAAe,EAAE,cAAc,CAAC,MAAM;YACtC,iBAAiB,EAAE,gBAAgB,CAAC,MAAM;YAC1C,cAAc,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;YACzC,cAAc,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;YACzC,gBAAgB,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC;SAC9C,CAAC;QAEF,yBAAyB;QACzB,IAAI,cAAc,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oEAAoE,cAAc,CAAC,MAAM,EAAE;gBAClG,OAAO;aACR,CAAC;QACJ,CAAC;QAED,wFAAwF;QACxF,IAAI,kBAAkB,GAAG,cAAc,CAAC;QACxC,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClC,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,uBAAuB,GAAG,cAAc,CAAC,MAAM,CAAC;YACxD,OAAO,CAAC,wBAAwB,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAC/D,CAAC;aAAM,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,gGAAgG,cAAc,CAAC,MAAM,EAAE;gBAC9H,OAAO;aACR,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAE3D,4CAA4C;QAC5C,2EAA2E;QAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YAC7B,IAAI;YACJ,IAAI,EAAE,sBAAsB;YAC5B,IAAI;YACJ,IAAI,EAAE,qBAAqB;YAC3B,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,kBAAkB;YACxB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,wCAAwC;SAC/C,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QAEnE,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;YAC1C,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;QAElF,OAAO;YACL,OAAO;YACP,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,wBAAwB,EAAE,kBAAkB,CAAC,MAAM;gBACnD,kBAAkB,EAAE,oCAAoC;aACzD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACvF,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;SAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,OAAO;QACL,UAAU,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE,CAAC,CAAC;YAC7C,OAAO,EAAE,eAAe,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YACvD,SAAS,EAAE,OAAO,CAAC,YAAY;SAChC,CAAC;QAEF,eAAe,EAAE,KAAK,EAAE,cAAsB,EAAE,UAAkB,EAAE,EAAE;YACpE,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACjF,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import type { BigNumber } from "bignumber.js";
2
- import type { TransactionCommon, TransactionCommonRaw, TransactionStatusCommon, TransactionStatusCommonRaw } from "@ledgerhq/types-live";
2
+ import type { Observable } from "rxjs";
3
+ import type { CurrencyBridge, TransactionCommon, TransactionCommonRaw, TransactionStatusCommon, TransactionStatusCommonRaw } from "@ledgerhq/types-live";
4
+ import type { CantonOnboardProgress, CantonOnboardResult, CantonPreApprovalProgress, CantonPreApprovalResult } from "./onboard";
5
+ export interface CantonCurrencyBridge extends CurrencyBridge {
6
+ onboardAccount: (deviceId: string, derivationPath: string) => Observable<CantonOnboardProgress | CantonOnboardResult>;
7
+ authorizePreapproval: (deviceId: string, derivationPath: string, partyId: string) => Observable<CantonPreApprovalProgress | CantonPreApprovalResult>;
8
+ }
3
9
  export type NetworkInfo = {
4
10
  family: "canton";
5
11
  serverFee: BigNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/types/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG;IAC5C,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AACxD,MAAM,MAAM,oBAAoB,GAAG,0BAA0B,CAAC"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/types/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,cAAc,EAAE,CACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,KACnB,UAAU,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,CAAC;IAC7D,oBAAoB,EAAE,CACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,KACZ,UAAU,CAAC,yBAAyB,GAAG,uBAAuB,CAAC,CAAC;CACtE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG;IAC5C,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AACxD,MAAM,MAAM,oBAAoB,GAAG,0BAA0B,CAAC"}
@@ -1,13 +1,4 @@
1
1
  export * from "./bridge";
2
+ export * from "./onboard";
2
3
  export * from "./signer";
3
- export type BoilerplateNativeTransaction = {
4
- TransactionType: "Payment";
5
- Account: string;
6
- Amount: string;
7
- Destination: string;
8
- Fee: string;
9
- Sequence: number;
10
- SigningPubKey?: string;
11
- TxnSignature?: string;
12
- };
13
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AAEzB,MAAM,MAAM,4BAA4B,GAAG;IACzC,eAAe,EAAE,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./bridge";
2
+ export * from "./onboard";
2
3
  export * from "./signer";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,55 @@
1
+ export declare enum OnboardStatus {
2
+ INIT = 0,
3
+ PREPARE = 1,
4
+ SIGN = 2,
5
+ SUBMIT = 3,
6
+ SUCCESS = 4,
7
+ ERROR = 5
8
+ }
9
+ export declare enum PreApprovalStatus {
10
+ INIT = 0,
11
+ PREPARE = 1,
12
+ SIGN = 2,
13
+ SUBMIT = 3,
14
+ SUCCESS = 4,
15
+ ERROR = 5
16
+ }
17
+ export type CantonOnboardProgress = {
18
+ status: OnboardStatus;
19
+ };
20
+ export type CantonOnboardResult = {
21
+ partyId: string;
22
+ };
23
+ export type CantonPreApprovalProgress = {
24
+ status: PreApprovalStatus;
25
+ };
26
+ export type CantonPreApprovalResult = {
27
+ isApproved: boolean;
28
+ };
29
+ /**
30
+ * Types for Canton Gateway Transaction API
31
+ * Based on the API endpoints in canton-gateway
32
+ */
33
+ export interface PrepareTransactionRequest {
34
+ type: "transfer-pre-approval-proposal";
35
+ receiver: string;
36
+ }
37
+ export interface PrepareTransactionResponse {
38
+ serialized: string;
39
+ json: any;
40
+ hash: string;
41
+ }
42
+ export interface SubmitTransactionRequest {
43
+ serialized: string;
44
+ signature: string;
45
+ }
46
+ export interface SubmitTransactionResponse {
47
+ submission_id: string;
48
+ update_id: string;
49
+ }
50
+ export interface PreApprovalResult {
51
+ isApproved: boolean;
52
+ submissionId: string;
53
+ updateId: string;
54
+ }
55
+ //# sourceMappingURL=onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/types/onboard.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,OAAO,IAAA;IACP,KAAK,IAAA;CACN;AAED,oBAAY,iBAAiB;IAC3B,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,OAAO,IAAA;IACP,KAAK,IAAA;CACN;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;GAGG;AAEH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,gCAAgC,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,19 @@
1
+ export var OnboardStatus;
2
+ (function (OnboardStatus) {
3
+ OnboardStatus[OnboardStatus["INIT"] = 0] = "INIT";
4
+ OnboardStatus[OnboardStatus["PREPARE"] = 1] = "PREPARE";
5
+ OnboardStatus[OnboardStatus["SIGN"] = 2] = "SIGN";
6
+ OnboardStatus[OnboardStatus["SUBMIT"] = 3] = "SUBMIT";
7
+ OnboardStatus[OnboardStatus["SUCCESS"] = 4] = "SUCCESS";
8
+ OnboardStatus[OnboardStatus["ERROR"] = 5] = "ERROR";
9
+ })(OnboardStatus || (OnboardStatus = {}));
10
+ export var PreApprovalStatus;
11
+ (function (PreApprovalStatus) {
12
+ PreApprovalStatus[PreApprovalStatus["INIT"] = 0] = "INIT";
13
+ PreApprovalStatus[PreApprovalStatus["PREPARE"] = 1] = "PREPARE";
14
+ PreApprovalStatus[PreApprovalStatus["SIGN"] = 2] = "SIGN";
15
+ PreApprovalStatus[PreApprovalStatus["SUBMIT"] = 3] = "SUBMIT";
16
+ PreApprovalStatus[PreApprovalStatus["SUCCESS"] = 4] = "SUCCESS";
17
+ PreApprovalStatus[PreApprovalStatus["ERROR"] = 5] = "ERROR";
18
+ })(PreApprovalStatus || (PreApprovalStatus = {}));
19
+ //# sourceMappingURL=onboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/types/onboard.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,iDAAI,CAAA;IACJ,uDAAO,CAAA;IACP,iDAAI,CAAA;IACJ,qDAAM,CAAA;IACN,uDAAO,CAAA;IACP,mDAAK,CAAA;AACP,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AAED,MAAM,CAAN,IAAY,iBAOX;AAPD,WAAY,iBAAiB;IAC3B,yDAAI,CAAA;IACJ,+DAAO,CAAA;IACP,yDAAI,CAAA;IACJ,6DAAM,CAAA;IACN,+DAAO,CAAA;IACP,2DAAK,CAAA;AACP,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,QAO5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-canton",
3
- "version": "0.5.0-nightly.1",
3
+ "version": "0.5.0-nightly.2",
4
4
  "description": "Canton coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -101,13 +101,13 @@
101
101
  "bignumber.js": "^9.1.2",
102
102
  "invariant": "^2.2.4",
103
103
  "rxjs": "^7.8.1",
104
- "@ledgerhq/coin-framework": "^6.4.0-nightly.1",
105
- "@ledgerhq/cryptoassets": "^13.28.0-nightly.0",
104
+ "@ledgerhq/coin-framework": "^6.4.0-nightly.2",
105
+ "@ledgerhq/cryptoassets": "^13.28.0-nightly.1",
106
106
  "@ledgerhq/devices": "8.5.1",
107
107
  "@ledgerhq/errors": "^6.25.0",
108
- "@ledgerhq/live-env": "^2.16.0-nightly.0",
109
- "@ledgerhq/live-network": "^2.0.17-nightly.0",
110
- "@ledgerhq/types-live": "^6.83.0"
108
+ "@ledgerhq/live-env": "^2.16.0-nightly.1",
109
+ "@ledgerhq/live-network": "^2.0.17-nightly.1",
110
+ "@ledgerhq/types-live": "^6.83.1-nightly.0"
111
111
  },
112
112
  "devDependencies": {
113
113
  "@types/invariant": "^2.2.37",
@@ -10,8 +10,7 @@ describe("devnet", () => {
10
10
  networkType: "devnet",
11
11
  gatewayUrl: "https://canton-gateway.api.live.ledger-test.com",
12
12
  useGateway: true,
13
- nativeInstrumentId:
14
- "6e9fc50fb94e56751b49f09ba2dc84da53a9d7cff08115ebb4f6b7a12d0c990c:Splice.Amulet:Amulet",
13
+ nativeInstrumentId: "Amulet",
15
14
  });
16
15
  });
17
16
 
package/src/api/index.ts CHANGED
@@ -2,13 +2,13 @@ import {
2
2
  AlpacaApi,
3
3
  Block,
4
4
  BlockInfo,
5
- CraftedTransaction,
6
5
  Cursor,
7
6
  FeeEstimation,
8
7
  Page,
9
8
  Reward,
10
9
  Stake,
11
10
  TransactionIntent,
11
+ CraftedTransaction,
12
12
  } from "@ledgerhq/coin-framework/api/index";
13
13
  import coinConfig, { type CantonConfig } from "../config";
14
14
  import {
@@ -17,7 +17,6 @@ import {
17
17
  craftTransaction,
18
18
  estimateFees,
19
19
  getBalance,
20
- getNextValidSequence,
21
20
  lastBlock,
22
21
  listOperations,
23
22
  } from "../common-logic";
@@ -29,8 +28,8 @@ export function createApi(config: CantonConfig): AlpacaApi {
29
28
  return {
30
29
  broadcast,
31
30
  combine,
32
- craftTransaction: craft,
33
- estimateFees: estimate,
31
+ craftTransaction: craft(config.nativeInstrumentId ?? ""),
32
+ estimateFees: estimate(config.nativeInstrumentId ?? ""),
34
33
  getBalance,
35
34
  lastBlock,
36
35
  listOperations,
@@ -49,28 +48,36 @@ export function createApi(config: CantonConfig): AlpacaApi {
49
48
  };
50
49
  }
51
50
 
52
- async function craft(transactionIntent: TransactionIntent): Promise<CraftedTransaction> {
53
- const nextSequenceNumber = await getNextValidSequence(transactionIntent.sender);
54
- const tx = await craftTransaction(
55
- { address: transactionIntent.sender, nextSequenceNumber },
56
- {
57
- recipient: transactionIntent.recipient,
58
- amount: new BigNumber(transactionIntent.amount.toString()),
59
- },
60
- );
61
- return { transaction: tx.serializedTransaction };
62
- }
51
+ const craft =
52
+ (tokenId: string) =>
53
+ async (transactionIntent: TransactionIntent): Promise<CraftedTransaction> => {
54
+ const tx = await craftTransaction(
55
+ { address: transactionIntent.sender },
56
+ {
57
+ recipient: transactionIntent.recipient,
58
+ amount: new BigNumber(transactionIntent.amount.toString()),
59
+ tokenId,
60
+ expireInSeconds: 24 * 60 * 60,
61
+ },
62
+ );
63
63
 
64
- async function estimate(transactionIntent: TransactionIntent): Promise<FeeEstimation> {
65
- const { serializedTransaction } = await craftTransaction(
66
- { address: transactionIntent.sender },
67
- {
68
- recipient: transactionIntent.recipient,
69
- amount: new BigNumber(transactionIntent.amount.toString()),
70
- },
71
- );
64
+ return { transaction: tx.serializedTransaction };
65
+ };
72
66
 
73
- const value = await estimateFees(serializedTransaction);
67
+ const estimate =
68
+ (tokenId: string) =>
69
+ async (transactionIntent: TransactionIntent): Promise<FeeEstimation> => {
70
+ const { serializedTransaction } = await craftTransaction(
71
+ { address: transactionIntent.sender },
72
+ {
73
+ recipient: transactionIntent.recipient,
74
+ amount: new BigNumber(transactionIntent.amount.toString()),
75
+ tokenId,
76
+ expireInSeconds: 24 * 60 * 60,
77
+ },
78
+ );
74
79
 
75
- return { value };
76
- }
80
+ const value = await estimateFees(serializedTransaction);
81
+
82
+ return { value };
83
+ };
@@ -6,7 +6,7 @@ describe("createTransaction", () => {
6
6
  expect(createTransaction({} as AccountLike<Account>).amount.toNumber()).toEqual(0);
7
7
  });
8
8
 
9
- it("should create a transaction with boilerplate family", () => {
9
+ it("should create a transaction with canton family", () => {
10
10
  expect(createTransaction({} as AccountLike<Account>).family).toEqual("canton");
11
11
  });
12
12
  });
@@ -7,10 +7,10 @@ import {
7
7
  } from "@ledgerhq/coin-framework/bridge/jsHelpers";
8
8
  import { CoinConfig } from "@ledgerhq/coin-framework/config";
9
9
  import { SignerContext } from "@ledgerhq/coin-framework/signer";
10
- import type { AccountBridge, CurrencyBridge } from "@ledgerhq/types-live";
10
+ import type { AccountBridge } from "@ledgerhq/types-live";
11
11
  import cantonCoinConfig, { type CantonCoinConfig } from "../config";
12
12
  import resolver from "../signer";
13
- import { CantonSigner } from "../types";
13
+ import { CantonCurrencyBridge, CantonSigner } from "../types";
14
14
  import type { Transaction } from "../types";
15
15
  import { broadcast } from "./broadcast";
16
16
  import { createTransaction } from "./createTransaction";
@@ -20,6 +20,7 @@ import { prepareTransaction } from "./prepareTransaction";
20
20
  import { buildSignOperation } from "./signOperation";
21
21
  import { getAccountShape } from "./sync";
22
22
  import { updateTransaction } from "./updateTransaction";
23
+ import { buildOnboardAccount, buildAuthorizePreapproval } from "./onboard";
23
24
 
24
25
  export function createBridges(
25
26
  signerContext: SignerContext<CantonSigner>,
@@ -30,11 +31,20 @@ export function createBridges(
30
31
  const getAddress = resolver(signerContext);
31
32
  const receive = makeAccountBridgeReceive(getAddressWrapper(getAddress));
32
33
 
33
- const scanAccounts = makeScanAccounts({ getAccountShape, getAddressFn: getAddress });
34
- const currencyBridge: CurrencyBridge = {
34
+ const scanAccounts = makeScanAccounts({
35
+ getAccountShape: getAccountShape,
36
+ getAddressFn: getAddress,
37
+ });
38
+
39
+ const onboardAccount = buildOnboardAccount(signerContext);
40
+ const authorizePreapproval = buildAuthorizePreapproval(signerContext);
41
+
42
+ const currencyBridge: CantonCurrencyBridge = {
35
43
  preload: () => Promise.resolve({}),
36
44
  hydrate: () => {},
37
45
  scanAccounts,
46
+ onboardAccount,
47
+ authorizePreapproval,
38
48
  };
39
49
 
40
50
  const signOperation = buildSignOperation(signerContext);
@@ -0,0 +1,219 @@
1
+ import { firstValueFrom, toArray } from "rxjs";
2
+ import { generateMockKeyPair, createMockSigner } from "../test/cantonTestUtils";
3
+ import { buildOnboardAccount, isAccountOnboarded, buildAuthorizePreapproval } from "./onboard";
4
+ import {
5
+ OnboardStatus,
6
+ PreApprovalStatus,
7
+ CantonOnboardProgress,
8
+ CantonOnboardResult,
9
+ CantonPreApprovalProgress,
10
+ CantonPreApprovalResult,
11
+ } from "../types/onboard";
12
+ import coinConfig from "../config";
13
+
14
+ describe("onboard (devnet)", () => {
15
+ const mockDeviceId = "test-device-id";
16
+ const mockDerivationPath = "44'/6767'/0'/0'/0'";
17
+
18
+ let onboardedAccount: {
19
+ keyPair: ReturnType<typeof generateMockKeyPair>;
20
+ mockSigner: ReturnType<typeof createMockSigner>;
21
+ mockSignerContext: jest.Mock;
22
+ onboardResult: CantonOnboardResult;
23
+ } | null = null;
24
+
25
+ beforeAll(() => {
26
+ coinConfig.setCoinConfig(() => ({
27
+ gatewayUrl: "https://canton-gateway.api.live.ledger-test.com",
28
+ useGateway: true,
29
+ networkType: "devnet",
30
+ status: {
31
+ type: "active",
32
+ },
33
+ }));
34
+ });
35
+
36
+ const getOnboardedAccount = () => {
37
+ if (!onboardedAccount) {
38
+ throw new Error(
39
+ "onboardedAccount is null. Ensure isAccountOnboarded test runs first to set it.",
40
+ );
41
+ }
42
+ return onboardedAccount;
43
+ };
44
+
45
+ describe("isAccountOnboarded", () => {
46
+ it("should return true for onboarded account", async () => {
47
+ // GIVEN
48
+ const keyPair = generateMockKeyPair();
49
+ const mockSigner = createMockSigner(keyPair);
50
+ const mockSignerContext = jest.fn().mockImplementation((deviceId, callback) => {
51
+ return callback(mockSigner);
52
+ });
53
+
54
+ const onboardObservable = buildOnboardAccount(mockSignerContext);
55
+ const onboardValues = await firstValueFrom(
56
+ onboardObservable(mockDeviceId, mockDerivationPath).pipe(toArray()),
57
+ );
58
+ const onboardResult = onboardValues.find(
59
+ (value): value is CantonOnboardResult => "partyId" in value,
60
+ );
61
+
62
+ if (!onboardResult) {
63
+ throw new Error("Failed to onboard account for shared test data");
64
+ }
65
+
66
+ // Save onboarded account for all tests that need a valid party ID
67
+ onboardedAccount = {
68
+ keyPair,
69
+ mockSigner,
70
+ mockSignerContext,
71
+ onboardResult,
72
+ };
73
+
74
+ // WHEN
75
+ const result = await isAccountOnboarded(keyPair.publicKeyHex);
76
+
77
+ // THEN
78
+ expect(result).not.toBe(false);
79
+ if (typeof result === "object") {
80
+ expect(result.party_id).toBeDefined();
81
+ expect(result.party_id).toBe(onboardResult!.partyId);
82
+ }
83
+ }, 30000);
84
+
85
+ it("should return false for non-onboarded account with fresh keypair", async () => {
86
+ // GIVEN
87
+ const keyPair = generateMockKeyPair();
88
+
89
+ // WHEN
90
+ const result = await isAccountOnboarded(keyPair.publicKeyHex);
91
+
92
+ // THEN
93
+ expect(result).toBe(false);
94
+ }, 15000);
95
+
96
+ it("should handle errors gracefully when checking non-existent party", async () => {
97
+ // GIVEN
98
+ const keyPair = generateMockKeyPair();
99
+
100
+ // WHEN
101
+ const result = await isAccountOnboarded(keyPair.publicKeyHex);
102
+
103
+ // THEN
104
+ expect(result).toBe(false);
105
+ }, 15000);
106
+ });
107
+
108
+ describe("buildOnboardAccount", () => {
109
+ it("should complete full onboarding flow with fresh keypair", async () => {
110
+ // GIVEN
111
+ const keyPair = generateMockKeyPair();
112
+ const mockSigner = createMockSigner(keyPair);
113
+ const mockSignerContext = jest.fn().mockImplementation((deviceId, callback) => {
114
+ return callback(mockSigner);
115
+ });
116
+ const onboardObservable = buildOnboardAccount(mockSignerContext);
117
+
118
+ // WHEN
119
+ const allValues = await firstValueFrom(
120
+ onboardObservable(mockDeviceId, mockDerivationPath).pipe(toArray()),
121
+ );
122
+ const progressValues = allValues.filter(
123
+ (value): value is CantonOnboardProgress => "status" in value && !("partyId" in value),
124
+ );
125
+ const resultValues = allValues.filter(
126
+ (value): value is CantonOnboardResult => "partyId" in value,
127
+ );
128
+
129
+ // THEN
130
+ // Check expected status progression
131
+ expect(progressValues.some(p => p.status === OnboardStatus.INIT)).toBe(true);
132
+ expect(progressValues.some(p => p.status === OnboardStatus.PREPARE)).toBe(true);
133
+ expect(progressValues.some(p => p.status === OnboardStatus.SIGN)).toBe(true);
134
+ expect(progressValues.some(p => p.status === OnboardStatus.SUBMIT)).toBe(true);
135
+
136
+ // Check final result
137
+ expect(resultValues.length).toBeGreaterThan(0);
138
+ const finalResult = resultValues[resultValues.length - 1];
139
+ expect(finalResult.partyId).toBeDefined();
140
+ expect(typeof finalResult.partyId).toBe("string");
141
+
142
+ expect(mockSignerContext).toHaveBeenCalled();
143
+ }, 30000);
144
+
145
+ it("should complete full onboarding flow with already onboarded account", async () => {
146
+ // GIVEN
147
+ const { keyPair, mockSignerContext, onboardResult: firstResult } = getOnboardedAccount();
148
+ const secondOnboardObservable = buildOnboardAccount(mockSignerContext);
149
+
150
+ // WHEN
151
+ const secondOnboardValues = await firstValueFrom(
152
+ secondOnboardObservable(mockDeviceId, mockDerivationPath).pipe(toArray()),
153
+ );
154
+ const secondResult = secondOnboardValues.find(
155
+ (value): value is CantonOnboardResult => "partyId" in value,
156
+ );
157
+
158
+ // THEN
159
+ expect(secondResult).toBeDefined();
160
+ expect(secondResult!.partyId).toBe(firstResult.partyId);
161
+ expect(typeof secondResult!.partyId).toBe("string");
162
+ }, 30000);
163
+ });
164
+
165
+ describe("buildAuthorizePreapproval", () => {
166
+ it("should complete preapproval flow for onboarded account", async () => {
167
+ // GIVEN
168
+ const { mockSignerContext, onboardResult } = getOnboardedAccount();
169
+ const preapprovalObservable = buildAuthorizePreapproval(mockSignerContext);
170
+
171
+ // WHEN
172
+ const preapprovalValues = await firstValueFrom(
173
+ preapprovalObservable(mockDeviceId, mockDerivationPath, onboardResult.partyId).pipe(
174
+ toArray(),
175
+ ),
176
+ );
177
+
178
+ const progressValues = preapprovalValues.filter(
179
+ (value): value is CantonPreApprovalProgress =>
180
+ "status" in value && !("isApproved" in value),
181
+ );
182
+ const resultValues = preapprovalValues.filter(
183
+ (value): value is CantonPreApprovalResult => "isApproved" in value,
184
+ );
185
+
186
+ // THEN
187
+ // Check expected status progression
188
+ expect(progressValues.some(p => p.status === PreApprovalStatus.PREPARE)).toBe(true);
189
+ expect(progressValues.some(p => p.status === PreApprovalStatus.SIGN)).toBe(true);
190
+ expect(progressValues.some(p => p.status === PreApprovalStatus.SUBMIT)).toBe(true);
191
+
192
+ // Check final result (should be approved)
193
+ expect(resultValues.length).toBeGreaterThan(0);
194
+ const finalResult = resultValues[resultValues.length - 1];
195
+ expect(finalResult.isApproved).toBe(true);
196
+ expect(typeof finalResult.isApproved).toBe("boolean");
197
+ }, 30000);
198
+
199
+ it("should handle invalid party ID gracefully", async () => {
200
+ // GIVEN
201
+ const keyPair = generateMockKeyPair();
202
+ const mockSigner = createMockSigner(keyPair);
203
+ const mockSignerContext = jest.fn().mockImplementation((deviceId, callback) => {
204
+ return callback(mockSigner);
205
+ });
206
+ const preapprovalObservable = buildAuthorizePreapproval(mockSignerContext);
207
+
208
+ // WHEN & THEN
209
+ try {
210
+ await firstValueFrom(
211
+ preapprovalObservable(mockDeviceId, mockDerivationPath, "invalid-party-id-123"),
212
+ );
213
+ expect(true).toBe(true);
214
+ } catch (error) {
215
+ expect(error).toBeDefined();
216
+ }
217
+ }, 30000);
218
+ });
219
+ });