スキャムほいほいコントラクトの作り方

多くは語りません。
不信なアグリゲートボンデッドトランザクションを受信したら、
資産を退避させて別のアカウントでハーベスト設定をするためのサンプルプログラムです。
（このサンプルプログラムでは実際のハーベスト設定を完了することはできません）


:::note alert 
このサンプルプログラムは大きな資産の移動を伴います。
新規作成した秘密鍵の保管に関しては説明しておりません。
自己責任で検証ください。
:::

### コントラクト詳細

- 新規アカウントを作成し、1万XYM以上を入金する
- ハーベスト設定のためのトランザクションを発生させる
- 不信なアグリゲートボンデッドトランザクションを受信したら資産を退避させる
- 上記を無限ループ

これは「スマコン」では無いと一部の人から言われそうなので、「スマート」という言葉は使用していません。

### ソースコード

事前に以下のページで環境構築しておいてください。

https://qiita.com/nem_takanobu/items/e88d5ea76cd609e76bbf


```js

alice = sym.Account.createFromPrivateKey(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
networkType
);


function hoihoi(){

    dummy =  sym.Account.generateNewAccount(networkType);
    console.log(dummy.address);
    console.log(dummy.privateKey);
    dummy2 =  sym.Account.generateNewAccount(networkType);

    tx = sym.TransferTransaction.create(
        sym.Deadline.create(epochAdjustment),
        dummy.address, 
        [networkCurrency.createRelative(14000)],
        sym.EmptyMessage,
        networkType
    ).setMaxFee(100);
    signedTx = alice.sign(tx,generationHash);

    listener.open().then(() => {
        transactionService.announce(signedTx,listener)
        .subscribe(x=>{
            console.log(x)


            accTx = sym.AccountKeyLinkTransaction.create(
                sym.Deadline.create(epochAdjustment),
                dummy2.publicAccount.publicKey,
                sym.TransactionVersion.ACCOUNT_KEY_LINK,
                networkType
            );

          vrfTx = sym.VrfKeyLinkTransaction.create(
            sym.Deadline.create(epochAdjustment),
            dummy2.publicAccount.publicKey,
            sym.LinkAction.Link,
            networkType
          );

            nodTx = sym.NodeKeyLinkTransaction.create(
                sym.Deadline.create(epochAdjustment),
                dummy2.publicAccount.publicKey,
                sym.LinkAction.Link,
                networkType,
            );

            aggregateArray = [
                accTx.toAggregate(dummy.publicAccount),
                vrfTx.toAggregate(dummy.publicAccount),
                nodTx.toAggregate(dummy.publicAccount),
            ]

            aggregateTx = sym.AggregateTransaction.createComplete(
                sym.Deadline.create(epochAdjustment),
                aggregateArray,
                networkType,[],
            ).setMaxFeeForAggregate(100, 0);


            signedTx2 = dummy.sign(aggregateTx,generationHash);
            txRepo.announce(signedTx2).subscribe(x=>console.log(x));
            clog(signedTx2);


            listener.aggregateBondedAdded(dummy.address)
            .subscribe(xx=>{

                console.log(xx);
                refundTx = sym.TransferTransaction.create(
                    sym.Deadline.create(epochAdjustment),
                    alice.address, 
                    [networkCurrency.createRelative(13,999.9392)],
                    sym.EmptyMessage,
                    networkType
                ).setMaxFee(100);
                signedTx3 = dummy.sign(refundTx,generationHash);
                clog(signedTx3); 
                transactionService.announce(signedTx3,listener)
                .subscribe(x=>{
                    console.log("done.");
                    hoihoi();
                });
            });
        })
    });
}


```

### リファンド

このコントラクトは一度始めたら、プログラムを終了するまで止まりません。
プログラム停止後、以下のトランザクションを実行して預けたままの資産を回収してください。

:::note alert
秘密鍵が必要です。上記終了時に秘密鍵を無くさないようにご注意ください
:::

```js
dummy = sym.Account.createFromPrivateKey(
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  networkType
);

tx = sym.TransferTransaction.create(
	sym.Deadline.create(epochAdjustment),
	alice.address, 
	[networkCurrency.createRelative(13999.87)],
	sym.EmptyMessage,
	networkType
).setMaxFee(100);
signedTx = dummy.sign(tx,generationHash);
txRepo.announce(signedTx).subscribe(x=>console.log(x));
clog(signedTx); 

```


以上です。
自動でHashLockトランザクションを発生させる行為は、そのトリガーを解析されると資産を失う結果になりかねません。
失った資産はハーベスト報酬となるため、攻撃者にメリットはありませんが、攻撃対象の評価を相対的に下げることは可能です。
ご注意ください。