🦔

firebase deploy直前にcpコマンドを使ってjsonファイルをコピーする

2023/07/27に公開

最初に

会社(Gaiax)の人に教えてもらったやり方です。自分で考えたわけではないのですが、firebaseをよく使う時に便利だったので記事にさせてもらいました。

使う状況(ブロックチェーン上のアプリケーションの場合)

自分がSolidityという言語を使ってよくスマートコントラクトを書くので、具体例として以下のような構成を例に考えます。

- contracts(スマートコントラクト関係)
  - artifacts
    - EXAMPLE.sol(ディレクトリ)
      - EXAMPLE.json 
  - contracts
    - EXAMPLE.sol(solidityファイル)  

- front(フロント関係)

- functions(バックエンド関係)
  - lib(ディレクトリ)
  - src(ディレクトリ)
    - index.ts
  - package.json

artifactsディレクトリとは?

Solidityだと、まずcontractsディレクトリ以下に何かしらのSolidityファイルを作ります。そのファイルをコンパイルすると生成されるのが、artifacts以下のjsonファイルです。

今回だとartifacts以下のEXAMPLE.jsonにabiの情報が書かれており、スマートコントラクトをfunctions内のindex.tsでインスタンス化して使う時に必要なファイルになります。

artifactsのEXAMPLE.jsonをfunctionsディレクトリ内で使いたい

たとえば、functionsディレクトリ以下(バックエンド側)で、contractsディレクトリ以下のEXAMPLE.solファイルで定義した何かしらの関数を使いたいとします。

そのためには、EXAMPLE.sol内で定義されているスマートコントラクトをインスタンス化する必要があります。その際に、EXAMPLE.solのabiファイルが必要です。そこで、artifactsディレクトリのEXAMPLE.jsonが必要になります。

Firebase functionsにdeployするときに対象となるファイル群は?

firebase functionsをデプロイする時に、デプロイする範囲のファイル群はfunctionsディレクトリ以下に限定されています。

そうなると、functions内のindex.tsでスマートコントラクトをインスタンス化したいとしても、その際に必要なEXAMPLE.jsonがfunctionsディレクトリ内に、contractsディレクトリのartifactsからコピーされている必要があります。

具体的にコピーする方法

functionsディレクトリのpackage.jsonを開きます。

package.json
"scripts": {
~~~他のスクリプトコマンド省略~~~
  "deploy": "cp ../contracts/artifacts/EXAMPLE.sol/EXAMPLE.json ./lib/ && firebase deploy --only functions",
}

上記のようにdeployコマンドの部分を書き換えれば、functionsをデプロイする前に、毎回functionsディレクトリのlibディレクトリにEXAMPLE.jsonをコピーしてくれます。

補足)index.tsファイル(バックエンド側)でスマートコントラクトをインスタンス化する

https://docs.ethers.org/v5/api/contract/contract/#Contract--creating
ether.jsを使う場合は、上記を参考にしてください。
new ethers.Contract( address , abi , signerOrProvider )

index.ts
// libからjsonファイルをよぶ
const exampleSol = require("./EXAMPLE.json")

// スマートコントラクトをインスタンス化する
const exampleInstance = new ethers.Contract(コントラクトアドレス, exampleSol.abi, サイナー)

Discussion