symbol-sdk@3.0.7で作るアカウントリストリクショントランザクション

# はじめに

こんにちは。

symbol-sdkの3系、トランザクションシリーズ第八弾です。

今回はアカウントリストリクションをやっていきます。

https://www.npmjs.com/package/symbol-sdk/v/3.0.7

## 注意事項

書いてあるコードについて、正確性や完全性を保証するものではありません。あくまで参考程度として頂き、最新情報は公式ドキュメンテーションをご確認ください。

# デッドラインと鍵ペア

まずは共通となる個所について。デッドラインと鍵ペアです。

```jsx
import symbolSdk from 'symbol-sdk';

const network = symbolSdk.symbol.Network.TESTNET;
const deadline = network.fromDatetime(new Date(Date.now() + 7200000)).timestamp;

const facade = new symbolSdk.facade.SymbolFacade(network.name);

const privateKey = new symbolSdk.PrivateKey(PRIVATE_KEY);
const keyPair = new facade.constructor.KeyPair(privateKey);
```

# フラグ

リストリクションのフラグを指定するときに、コードを短く書くための工夫。

```jsx
const { AccountRestrictionFlags } = symbolSdk.symbol;
```

# アカウントアドレスリストリクション

このトランザクションの場合、リストリクションフラグが４つあります。

論理和を使って表現していきます。数値を知っていればそのまま数値型で指定することもできます。

```jsx
const allowIncomingAddress = AccountRestrictionFlags.ADDRESS.value;
const blockIncomingAddress = AccountRestrictionFlags.ADDRESS.value | AccountRestrictionFlags.BLOCK.value;
const allowOutgoingAddress = AccountRestrictionFlags.ADDRESS.value | AccountRestrictionFlags.OUTGOING.value;
const blockOutgoingAddress = AccountRestrictionFlags.ADDRESS.value | AccountRestrictionFlags.BLOCK.value | AccountRestrictionFlags.OUTGOING.value;
```

トランザクションを作成していきます。

`restrictionAdditions` に指定したいアドレスを入れて、 `restrictionDeletions` に解除したいアドレスを入れる形になります。

このコードでは、フラグは `allowIncomingAddress` を指定しています。要件に合わせて変えます。

```jsx
const transaction1 = facade.transactionFactory.create({
  type: 'account_address_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  restrictionFlags: new AccountRestrictionFlags(allowIncomingAddress),
  restrictionAdditions: [ ADDRESS_RECEIVER_1 ],
  restrictionDeletions: [],
});
```

# アカウントモザイクリストリクション

このトランザクションの場合は、リストリクションフラグは２つです。

こちらは、受け取るモザイクをホワイトリスト方式もしくはブラックリスト方式にすることができます。

```jsx
const allowMosaic = AccountRestrictionFlags.MOSAIC_ID.value;
const blockMosaic = AccountRestrictionFlags.MOSAIC_ID.value | AccountRestrictionFlags.BLOCK.value;
```

トランザクションを作成します。

必要なパラメータは、上記トランザクションとほとんど似ています。

```jsx
const transaction2 = facade.transactionFactory.create({
  type: 'account_mosaic_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  restrictionFlags: new AccountRestrictionFlags(blockMosaic),
  restrictionAdditions: [ 0x2A3CB9A67A523DD4n ],
  restrictionDeletions: [],
});
```

# アカウントオペレーションリストリクション

このトランザクションの場合は、リストリクションフラグは２つです。

こちらは、送るトランザクションの種類をホワイトリストまたはブラックリスト方式にすることができます。

```jsx
const allowOutgoingTransactionType = AccountRestrictionFlags.TRANSACTION_TYPE.value | AccountRestrictionFlags.OUTGOING.value;
const blockOutgoingTransactionType = AccountRestrictionFlags.TRANSACTION_TYPE.value | AccountRestrictionFlags.OUTGOING.value | AccountRestrictionFlags.BLOCK.value;
```

トランザクションの作成に必要なパラメータ。

```jsx
const { TransactionType } = symbolSdk.symbol;
```

トランザクションを作成します。

```jsx
const transaction3 = facade.transactionFactory.create({
  type: 'account_operation_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  restrictionFlags: new AccountRestrictionFlags(blockOutgoingTransactionType),
  restrictionAdditions: [ TransactionType.MOSAIC_DEFINITION ],
  restrictionDeletions: [],
});
```

# 署名と送信

トランザクションに署名をして送信します。

上記のトランザクションは、 `transaction1` `transaction2` `transaction3` という変数名になっているので、ここのコードで使っている `transaction` という変数との整合性をとる必要があることに注意してください。

```jsx
const signature = facade.signTransaction(keyPair, transaction);
const jsonPayload = facade.transactionFactory.constructor.attachSignature(transaction, signature);
const hash = facade.hashTransaction(transaction).toString();

console.log(jsonPayload);
console.log(hash);

const sendRes = await axios.put(`${NODE_URL}/transactions`, jsonPayload).then((res) => res.data);
console.log(sendRes);

await axios
  .get(`${NODE_URL}/transactionStatus/${hash}`).then((res) => res.data)
  .then((statusRes) => {
    console.log(statusRes)
  })
  .catch((e) => {
    console.log(e.message, e.response.data)
  });
```

# おわりに

今回は、アカウントリストリクショントランザクションをやっていきました。

# シリーズ

https://qiita.com/planethouki/items/860d9f1095c087ccd98f

https://qiita.com/planethouki/items/25f104ef4930b019ddfb

https://qiita.com/planethouki/items/525b5a582f78be57217b

https://qiita.com/planethouki/items/c0336b479f6c11918183

https://qiita.com/planethouki/items/348bbfdc550ab5528c31

https://qiita.com/planethouki/items/b7f0ae2c934a90797ebb

https://qiita.com/planethouki/items/854ad7124748a24d936c