unwallet-client-sdk 0.9.1 → 0.10.0

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # unWallet client-side SDK
2
2
 
3
- :warning: This SDK works fine only on browsers.
3
+ :warning: This SDK works correctly only on web browsers.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,6 @@ const unWallet = await UnWallet.init({
18
18
  });
19
19
  ```
20
20
 
21
- ## Functions
21
+ ## Usage
22
22
 
23
- - [For all developers](docs/functions-1.md)
24
- - [For web3 developers](docs/functions-2.md)
23
+ See [Functions](docs/functions.md).
@@ -1 +1 @@
1
- {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../src/configs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;CAa5D,CAAC"}
1
+ {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../src/configs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;CAS5D,CAAC"}
package/dist/configs.js CHANGED
@@ -7,10 +7,6 @@ exports.unWalletConfigs = {
7
7
  wsAPIURL: "wss://in-ws-api.id.unwallet.world",
8
8
  },
9
9
  dev: {
10
- baseURL: "https://id.unwallet.dev",
11
- wsAPIURL: "wss://in-ws-api.id.unwallet.dev",
12
- },
13
- local: {
14
10
  baseURL: "http://localhost:4200",
15
11
  wsAPIURL: "wss://in-ws-api.id.test.unwallet.dev",
16
12
  },
package/dist/types.d.ts CHANGED
@@ -6,13 +6,11 @@ export interface UnWalletConfig {
6
6
  baseURL: string;
7
7
  wsAPIURL: string;
8
8
  }
9
- export interface DigestAndSignature {
9
+ export interface SignResult {
10
10
  digest: string;
11
11
  signature: string;
12
12
  }
13
- export interface MetaTransaction {
14
- executor: string;
15
- data: string;
16
- signature: string;
13
+ export interface SendTransactionResult {
14
+ TransactionID: string;
17
15
  }
18
16
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -1,4 +1,4 @@
1
- import { Config, UnWalletConfig, DigestAndSignature, MetaTransaction } from "./types";
1
+ import { Config, UnWalletConfig, SignResult, SendTransactionResult } from "./types";
2
2
  export declare class UnWallet {
3
3
  private config;
4
4
  private unWalletConfig;
@@ -18,17 +18,14 @@ export declare class UnWallet {
18
18
  }): void;
19
19
  sign(args: {
20
20
  message: string;
21
- }): Promise<DigestAndSignature>;
22
- signTransaction(args: {
23
- to: string;
21
+ }): Promise<SignResult>;
22
+ sendTransaction(args: {
23
+ chainID: number;
24
+ toAddress: string;
24
25
  value?: string;
25
26
  data?: string;
26
- }): Promise<MetaTransaction>;
27
- signTokenTransfer(args: {
28
- id: number;
29
- to: string;
30
- amount: number;
31
- }): Promise<MetaTransaction>;
27
+ ticket: string;
28
+ }): Promise<SendTransactionResult>;
32
29
  private getConnectionID;
33
30
  private sendWSMessage;
34
31
  private handleWSMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"unwallet.d.ts","sourceRoot":"","sources":["../src/unwallet.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;IAEvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAwC;gBAE1C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS;IAUzE,OAAO,CAAC,eAAe;WAKT,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsC9C,SAAS,CAAC,IAAI,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IA2BD,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsB5D,eAAe,CAAC,IAAI,EAAE;QAC3B,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,eAAe,CAAC;IAiBrB,iBAAiB,CAAC,IAAI,EAAE;QAC7B,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkB5B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,UAAU;CAYnB"}
1
+ {"version":3,"file":"unwallet.d.ts","sourceRoot":"","sources":["../src/unwallet.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,EACV,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;IAEvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAwC;gBAE1C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS;IAUzE,OAAO,CAAC,eAAe;WAKT,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsC9C,SAAS,CAAC,IAAI,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IA2BD,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBpD,eAAe,CAAC,IAAI,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgClC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,UAAU;CAYnB"}
package/dist/unwallet.js CHANGED
@@ -86,32 +86,24 @@ class UnWallet {
86
86
  this.openWindow(url);
87
87
  });
88
88
  }
89
- // DEPRECATED
90
- signTransaction(args) {
89
+ sendTransaction(args) {
91
90
  return new Promise((resolve, reject) => {
92
- this.resolve = resolve;
93
- this.reject = reject;
94
- const url = new URL(`${this.unWalletConfig.baseURL}/x/signTransaction`);
95
- {
96
- url.searchParams.set("connectionID", this.connectionID);
97
- url.searchParams.set("clientID", this.config.clientID);
98
- url.searchParams.set("transaction", JSON.stringify(args));
91
+ if (args.value === undefined && args.data === undefined) {
92
+ throw new Error("either value or data required");
99
93
  }
100
- this.openWindow(url);
101
- });
102
- }
103
- // DEPRECATED
104
- signTokenTransfer(args) {
105
- return new Promise((resolve, reject) => {
106
- this.resolve = resolve;
94
+ this.resolve = (txID) => {
95
+ resolve({ TransactionID: txID });
96
+ };
107
97
  this.reject = reject;
108
- const url = new URL(`${this.unWalletConfig.baseURL}/x/signTokenTransfer`);
98
+ const url = new URL(`${this.unWalletConfig.baseURL}/x/sendTransaction`);
109
99
  {
110
100
  url.searchParams.set("connectionID", this.connectionID);
111
101
  url.searchParams.set("clientID", this.config.clientID);
112
- url.searchParams.set("id", args.id.toString());
113
- url.searchParams.set("to", args.to);
114
- url.searchParams.set("amount", args.amount.toString());
102
+ url.searchParams.set("chainID", args.chainID.toString());
103
+ url.searchParams.set("toAddress", args.toAddress);
104
+ url.searchParams.set("value", args.value !== undefined ? args.value : "0x0");
105
+ url.searchParams.set("data", args.data !== undefined ? args.data : "0x");
106
+ url.searchParams.set("ticket", args.ticket);
115
107
  }
116
108
  this.openWindow(url);
117
109
  });
@@ -1,16 +1,18 @@
1
- # Functions (for all developers)
1
+ # Functions
2
2
 
3
3
  > **Note**\
4
- > To execute the sample codes below, you need to create an application with unWallet Enterprise in advance.
4
+ > You need to register your application to unWallet Enterprise in advance.
5
5
 
6
6
  ## authorize
7
7
 
8
8
  `authorize` requests a user's ID token in accordance with OpenID Connect (response_type: id_token).
9
9
 
10
+ ### Example call
11
+
10
12
  ```js
11
13
  unWallet.authorize({
12
14
  redirectURL: "http://your.app.com/callback",
13
- nonce: "pdITKAtep0pfPOrUXdzjqW6gKvXezurJ", // arbitrary string to prevent replay attacks
15
+ nonce: "ARBITRARY_STRING_TO_PREVENT_REPLAY_ATTACKS",
14
16
  });
15
17
  ```
16
18
 
@@ -18,13 +20,15 @@ unWallet.authorize({
18
20
 
19
21
  `sign` requests a signature for a message.
20
22
 
23
+ ### Example call
24
+
21
25
  ```js
22
- const sig = await unWallet.sign({
26
+ const result = await unWallet.sign({
23
27
  message: "ARBITRARY_MESSAGE",
24
28
  });
25
29
  ```
26
30
 
27
- ### Example return value
31
+ ### Example result
28
32
 
29
33
  ```json
30
34
  {
@@ -83,26 +87,32 @@ const ethers = require("ethers");
83
87
  })();
84
88
  ```
85
89
 
86
- ## signTokenTransfer
90
+ ## sendTransaction
91
+
92
+ `sendTransaction` requests to send a transaction.
87
93
 
88
- `signTokenTransfer` requests a signature for a token transfer transaction.
94
+ ### Example call
95
+
96
+ > **Note**\
97
+ > You need to issue a transaction ticket via unWallet Enterprise API in advance.
89
98
 
90
99
  ```js
91
- const metaTx = await unWallet.signTokenTransfer({
92
- id: 101, // token ID
93
- to: "0xB481148EB6A5f6b5b9Cc10cb0C8304B9B179A8e6", // destination address
94
- amount: 1, // token amount
100
+ const result = await unWallet.sendTransaction({
101
+ chainID: 80002,
102
+ toAddress: "0xC2C747E0F7004F9E8817Db2ca4997657a7746928",
103
+ value: "0xde0b6b3a7640000", // the amount of native token to be transferred
104
+ ticket:
105
+ "eyJhbGciOiJFUzI1NiIsImtpZCI6IjEiLCJ0eXAiOiJKV1QifQ.eyJhcGlDbGllbnRJRCI6IlFWQkpRMnhwWlc1ME9qRT0iLCJjaGFpbklEIjo4MDAwMiwiY2xpZW50SUQiOiJDWHFsSnBLWWlYTHpWdXEzbVU0OVVZNVVGbjJOM1VSVnQiLCJleHAiOjE3MTk0OTM3NzEsImlhdCI6MTcxOTQ5MzcxMSwiaWQiOiJkYjA1OTQ1MDI4MDQ4MWQ1ZjMxOWNlZWIwZTJkMjQ4MTNkNjc4OTdlODA1MGU1YTVmNWIyZWJkNzUxYmMwM2Y5IiwicGF5bWVudFR5cGUiOiJ1c2VyIiwidHJhbnNhY3Rpb25EYXRhIjoiMHgiLCJ0cmFuc2FjdGlvbkZyb21BZGRyZXNzIjoiMHgxMDVmNDMxMGIzRDE4RTNEN0YxOWZEN0RGNDg4NzM1YTE1MGVlZDJhIiwidHJhbnNhY3Rpb25Ub0FkZHJlc3MiOiIweEMyQzc0N0UwRjcwMDRGOUU4ODE3RGIyY2E0OTk3NjU3YTc3NDY5MjgiLCJ0cmFuc2FjdGlvblZhbHVlIjoiMHhkZTBiNmIzYTc2NDAwMDAifQ.LIzAe8Ar3c0KNWf0bczVUDodMj6pwwWngESC7AaWI9PHbmeQ6q3zsXgFJm__pi1mLJ79fHZfI0DF4fjreUDZtQ",
95
106
  });
96
107
  ```
97
108
 
98
- ### Example return value
109
+ ### Example result
99
110
 
100
111
  ```json
101
112
  {
102
- "executor": "0x3ADBDCBa56d70Fc15Dcbe98901432cC07B2aAaeF",
103
- "data": "0x...",
104
- "signature": "0x19eb83842bc2d2c55567d4da63981ae9d4ce76ec567b591f18e18f4e030c4389331ba3ce0f1549331cb51710881320982b7b7a3632a7d81ca214690ecf3267c51c"
113
+ "transactionID": "UXVldWVkVHJhbnNhY3Rpb246MQ=="
105
114
  }
106
115
  ```
107
116
 
108
- To execute the transaction, call [POST /metaTransactions of unWallet Enterprise API](https://developers.ent.unwallet.world/ja/latest/unwallet-ent-api.html#post-metatransactions).
117
+ > **Note**\
118
+ > You can get the transaction detail via unWallet Enterprise API.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unwallet-client-sdk",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "unWallet client-side SDK",
5
5
  "license": "MIT",
6
6
  "author": "SIVIRA",
@@ -15,7 +15,7 @@
15
15
  }
16
16
  },
17
17
  "dependencies": {
18
- "ethers": "6.12.0"
18
+ "ethers": "6.13.1"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@commitlint/cli": "19.3.0",
@@ -23,7 +23,7 @@
23
23
  "commitizen": "4.3.0",
24
24
  "cz-conventional-changelog": "3.3.0",
25
25
  "husky": "9.0.11",
26
- "typescript": "5.4.5"
26
+ "typescript": "5.5.2"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsc",
package/src/configs.ts CHANGED
@@ -6,10 +6,6 @@ export const unWalletConfigs: { [env: string]: UnWalletConfig } = {
6
6
  wsAPIURL: "wss://in-ws-api.id.unwallet.world",
7
7
  },
8
8
  dev: {
9
- baseURL: "https://id.unwallet.dev",
10
- wsAPIURL: "wss://in-ws-api.id.unwallet.dev",
11
- },
12
- local: {
13
9
  baseURL: "http://localhost:4200",
14
10
  wsAPIURL: "wss://in-ws-api.id.test.unwallet.dev",
15
11
  },
package/src/types.ts CHANGED
@@ -8,13 +8,11 @@ export interface UnWalletConfig {
8
8
  wsAPIURL: string;
9
9
  }
10
10
 
11
- export interface DigestAndSignature {
11
+ export interface SignResult {
12
12
  digest: string;
13
13
  signature: string;
14
14
  }
15
15
 
16
- export interface MetaTransaction {
17
- executor: string;
18
- data: string;
19
- signature: string;
16
+ export interface SendTransactionResult {
17
+ TransactionID: string;
20
18
  }
package/src/unwallet.ts CHANGED
@@ -4,8 +4,8 @@ import { unWalletConfigs } from "./configs";
4
4
  import {
5
5
  Config,
6
6
  UnWalletConfig,
7
- DigestAndSignature,
8
- MetaTransaction,
7
+ SignResult,
8
+ SendTransactionResult,
9
9
  } from "./types";
10
10
 
11
11
  export class UnWallet {
@@ -104,7 +104,7 @@ export class UnWallet {
104
104
  location.assign(url.toString());
105
105
  }
106
106
 
107
- public sign(args: { message: string }): Promise<DigestAndSignature> {
107
+ public sign(args: { message: string }): Promise<SignResult> {
108
108
  return new Promise((resolve, reject) => {
109
109
  this.resolve = (sig: string) => {
110
110
  resolve({
@@ -125,44 +125,38 @@ export class UnWallet {
125
125
  });
126
126
  }
127
127
 
128
- // DEPRECATED
129
- public signTransaction(args: {
130
- to: string;
128
+ public sendTransaction(args: {
129
+ chainID: number;
130
+ toAddress: string;
131
131
  value?: string;
132
132
  data?: string;
133
- }): Promise<MetaTransaction> {
133
+ ticket: string;
134
+ }): Promise<SendTransactionResult> {
134
135
  return new Promise((resolve, reject) => {
135
- this.resolve = resolve;
136
- this.reject = reject;
137
-
138
- const url = new URL(`${this.unWalletConfig.baseURL}/x/signTransaction`);
139
- {
140
- url.searchParams.set("connectionID", this.connectionID);
141
- url.searchParams.set("clientID", this.config.clientID);
142
- url.searchParams.set("transaction", JSON.stringify(args));
136
+ if (args.value === undefined && args.data === undefined) {
137
+ throw new Error("either value or data required");
143
138
  }
144
139
 
145
- this.openWindow(url);
146
- });
147
- }
148
-
149
- // DEPRECATED
150
- public signTokenTransfer(args: {
151
- id: number;
152
- to: string;
153
- amount: number;
154
- }): Promise<MetaTransaction> {
155
- return new Promise((resolve, reject) => {
156
- this.resolve = resolve;
140
+ this.resolve = (txID: string) => {
141
+ resolve({ TransactionID: txID });
142
+ };
157
143
  this.reject = reject;
158
144
 
159
- const url = new URL(`${this.unWalletConfig.baseURL}/x/signTokenTransfer`);
145
+ const url = new URL(`${this.unWalletConfig.baseURL}/x/sendTransaction`);
160
146
  {
161
147
  url.searchParams.set("connectionID", this.connectionID);
162
148
  url.searchParams.set("clientID", this.config.clientID);
163
- url.searchParams.set("id", args.id.toString());
164
- url.searchParams.set("to", args.to);
165
- url.searchParams.set("amount", args.amount.toString());
149
+ url.searchParams.set("chainID", args.chainID.toString());
150
+ url.searchParams.set("toAddress", args.toAddress);
151
+ url.searchParams.set(
152
+ "value",
153
+ args.value !== undefined ? args.value : "0x0"
154
+ );
155
+ url.searchParams.set(
156
+ "data",
157
+ args.data !== undefined ? args.data : "0x"
158
+ );
159
+ url.searchParams.set("ticket", args.ticket);
166
160
  }
167
161
 
168
162
  this.openWindow(url);
@@ -1,32 +0,0 @@
1
- # Functions (for web3 developers)
2
-
3
- Use the following functions only if you want to work with your own contracts.
4
-
5
- > **Note**\
6
- > To execute the sample codes below, you need to create an application with unWallet Enterprise in advance.
7
-
8
- ## signTransaction
9
-
10
- `signTransaction` requests a signature for a transaction.
11
-
12
- ```js
13
- const metaTx = await unWallet.signTransaction({
14
- to: "0xB481148EB6A5f6b5b9Cc10cb0C8304B9B179A8e6", // the address the transaction is directed to
15
- value: "0x0", // the MATIC value sent with this transaction (optional)
16
- data: "0x...", // the hash of the invoked method signature and encoded parameters (optional)
17
- });
18
- ```
19
-
20
- :warning: You cannot specify parameters related to gas here because the gas consumed by the meta transaction is paid by the provider wallet.
21
-
22
- ### Example return value
23
-
24
- ```json
25
- {
26
- "executor": "0x3ADBDCBa56d70Fc15Dcbe98901432cC07B2aAaeF",
27
- "data": "0x...",
28
- "signature": "0x19eb83842bc2d2c55567d4da63981ae9d4ce76ec567b591f18e18f4e030c4389331ba3ce0f1549331cb51710881320982b7b7a3632a7d81ca214690ecf3267c51c"
29
- }
30
- ```
31
-
32
- To execute the transaction, call [POST /metaTransactions of unWallet Enterprise API](https://developers.ent.unwallet.world/ja/latest/unwallet-ent-api.html#post-metatransactions).