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);
```

# モザイクグローバルリストリクション

対象のモザイクについて、グローバールなリストリクションルールを設定します。

## モザイクとキー

対象のモザイクを指定します。BigIntか、 `UnresolvedMosaicId` が使用できます。

```jsx
const mosaicId = 0x2A3CB9A67A523DD4n;
const mosaicId = new symbolSdk.symbol.UnresolvedMosaicId(0x2A3CB9A67A523DD4n);
```

リストリクションキーを指定します。BigInt型で8バイトまで使えます。

```jsx
const restrictionKey = 0x0000000012345678n;
```

## リストリクションタイプ

モザイクリストリクションタイプを指定します。確か8種類あったと思います。

トランザクションでは、以前のタイプと次の新しいタイプを指定します。

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

const previousRestrictionType = MosaicRestrictionType.NONE;
const previousRestrictionType = MosaicRestrictionType.EQ;
const previousRestrictionType = MosaicRestrictionType.LT;
const previousRestrictionType = MosaicRestrictionType.LE;
const previousRestrictionType = MosaicRestrictionType.GT;
const previousRestrictionType = MosaicRestrictionType.GE;
const previousRestrictionType = MosaicRestrictionType.NE;
```

```jsx
const newRestrictionType = MosaicRestrictionType.EQ;
```

## トランザクション

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

`previousRestrictionValue` と `newRestrictionValue` は、BigInt型で8バイトまで指定できます。

```jsx
const transaction = facade.transactionFactory.create({
  type: 'mosaic_global_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  mosaicId,
  restrictionKey,
  previousRestrictionType,
  previousRestrictionValue: 0n,
  newRestrictionType,
  newRestrictionValue: 1n,
  // referenceMosaicId: 0x2A3CB9A67A523DD4n,
});
```

`referenceMosaicId` は、以下のようなシナリオで使用します。使用しない場合は、0が使われます。

[モザイクの制限を第三者に委任する — Symbol Documentation](https://docs.symbol.dev/ja/guides/restriction/delegating-mosaic-restrictions-to-a-third-party.html)

# モザイクアドレスリストリクション

対象のモザイクについて、特定のアドレスにリストリクション値を設定していきます。

`previousRestrictionValue` と `newRestrictionValue` があり、BigInt型で8バイトまで指定できます。

以前のリストリクション値がなく、新規に値を設定する場合は、 `previousRestrictionValue` は `0xFFFFFFFFFFFFFFFFn` でなければなりません。

https://github.com/symbol/symbol/blob/catbuffer/schemas/v3.1.0/catbuffer/schemas/symbol/restriction_mosaic/mosaic_address_restriction.cats#L11-L13

```jsx
const transaction = facade.transactionFactory.create({
  type: 'mosaic_address_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  mosaicId,
  restrictionKey,
  // previousRestrictionValue: 0xFFFFFFFFFFFFFFFFn,
  previousRestrictionValue: 1n,
  newRestrictionValue: 2n,
  targetAddress: ADDRESS_RECEIVER_1,
});
```

# 共通（後半）

こちらはトランザクションを作った後の、送信するコードになります。

署名をしてハッシュを計算して、送信して、ステータスを確認します。

```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)
  });
```

# おわりに

今回は、モザイクリストリクションについて書きました。Symbolの中でも、少し複雑な部類になりますので、何度もマニュアルを見返して理解していければと思います。

# シリーズ

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

https://qiita.com/planethouki/items/461fef6c8c5fbf850a1f