SDK 사용하기

이 튜토리얼에서는 TypeScript SDK를 사용하여 IP 자산에 돈을 보내는 방법(“팁”)을 배우게 됩니다.

설명

이 시나리오에서, 미키 마우스를 나타내는 부모 IP 자산이 있다고 가정해 봅시다. 다른 사람이 그 미키 마우스에 모자를 그려 파생(또는 “자식”) IP 자산으로 등록합니다. 라이선스 조건은 자식이 모든 상업적 수익의 50%를 부모와 공유해야 한다고 명시합니다(commercialRevShare = 50). 다른 사람(제3자 사용자)이 와서 정말 멋지다고 생각해 파생 작품에 2 $WIP를 보내고 싶어 합니다.

이 예제의 목적상, 우리는 자식이 이미 파생 IP 자산으로 등록되어 있다고 가정할 것입니다. 이 방법을 배우는 데 도움이 필요하다면, 다음을 확인하세요: 파생 작품 등록하기.

  • 부모 IP ID: 0x42595dA29B541770D9F9f298a014bF912655E183
  • 자식 IP ID: 0xeaa4Eed346373805B377F5a4fe1daeFeFB3D182a

0. 시작하기 전에

튜토리얼을 시작하기 전에 완료해야 할 몇 가지 단계가 있습니다.

  1. 다음을 설치해야 합니다: Node.jsnpm. 이전에 코딩을 해보셨다면 이미 설치되어 있을 것입니다.
  2. Story Network Testnet 지갑의 개인 키를 다음에 추가하세요: .env file:
env
WALLET_PRIVATE_KEY=<YOUR_WALLET_PRIVATE_KEY>
  1. 선호하는 RPC URL을 .env 파일에 추가하세요. 우리가 제공하는 공개 기본 URL을 사용할 수 있습니다:
env
RPC_PROVIDER_URL=https://aeneid.storyrpc.io
  1. 의존성을 설치하세요:
Terminal
npm install @story-protocol/core-sdk viem

1. Story Config 설정하기

다음 utils.ts 파일에 Story Config를 설정하기 위해 다음 코드를 추가하세요:

utils.ts
import { StoryClient, StoryConfig } from "@story-protocol/core-sdk";
import { http } from "viem";
import { privateKeyToAccount, Address, Account } from "viem/accounts";

const privateKey: Address = `0x${process.env.WALLET_PRIVATE_KEY}`;
export const account: Account = privateKeyToAccount(privateKey);

const config: StoryConfig = {
  account: account,
  transport: http(process.env.RPC_PROVIDER_URL),
  chainId: "aeneid",
};
export const client = StoryClient.newClient(config);

2. 파생 IP 자산에 팁 주기

이제 main.ts 파일을 생성하세요. 우리는 payRoyaltyOnBehalf 함수를 사용하여 파생 자산에 지불할 것입니다.

IP 자산에 [WIP](https://aeneid.storyscan.io/address/0x1514000000000000000000000000000000000000).NotethatifyoudonthaveenoughWIP](https://aeneid.storyscan.io/address/0x1514000000000000000000000000000000000000). **Note that if you don't have enough WIP로 지불하게 될 것입니다. 이 함수는 자동으로 동등한 양의 IPintoIP into WIP를 래핑할 것입니다.** 둘 중 하나가 충분하지 않으면 실패할 것입니다.

화이트리스트에 등록된 수익 토큰

우리 프로토콜에 의해 화이트리스트에 등록된 토큰만 지불(“수익”) 토큰으로 사용될 수 있습니다. $WIP는 그 토큰 중 하나입니다. 그 목록을 보려면 here를 참조하세요.

이제 우리는 payRoyaltyOnBehalf 함수를 호출할 수 있습니다. 이 경우:

  1. receiverIpId는 파생(자식) 자산의 ipId입니다
  2. payerIpIdzeroAddress입니다. 왜냐하면 지불자는 제3자(모자를 쓴 미키 마우스가 멋지다고 생각하는 사람)이며, 반드시 다른 IP 자산일 필요는 없기 때문입니다
  3. token는 $WIP의 주소입니다. 이는 here
  4. amount는 2입니다. 팁을 주는 사람이 2 $WIP를 보내고 싶어하기 때문입니다
main.ts
import { client } from "./utils";
import { zeroAddress, parseEther } from "viem";
import { WIP_TOKEN_ADDRESS } from "@story-protocol/core-sdk";

async function main() {
  const response = await client.royalty.payRoyaltyOnBehalf({
    receiverIpId: "0xeaa4Eed346373805B377F5a4fe1daeFeFB3D182a",
    payerIpId: zeroAddress,
    token: WIP_TOKEN_ADDRESS,
    amount: parseEther("2"), // 2 $WIP
    txOptions: { waitForTransaction: true },
  });
  console.log(`Paid royalty at transaction hash ${response.txHash}`);
}

main();

3. 자식이 받을 수익 청구하기

이 시점에서 우리는 이미 튜토리얼을 마쳤습니다: IP 자산에 팁을 주는 방법을 배웠습니다. 하지만 자식과 부모가 받을 수익을 청구하고 싶다면 어떻게 해야 할까요?

자식은 2 $WIP를 받았습니다. 하지만 라이선스 조건의 commercialRevenue = 50 때문에 수익의 50%를 부모 IP와 공유한다는 것을 기억하세요.

자식 IP는 다음을 호출하여 1 $WIP를 청구할 수 있습니다: claimAllRevenue function:

  • ancestorIpId는 자금이 있는 로열티 금고와 연관된 IP 자산의 ipId입니다 (더 간단히 말하면, 이는 단순히 자식의 ipId입니다)
  • currencyTokens는 $WIP의 주소를 포함하는 배열입니다. 이는 here
  • claimer는 자식의 IP Royalty Vault와 관련된 로열티 토큰을 보유하는 주소입니다. 기본적으로, 이들은 IP 계정에 있으며, 이는 단순히 자식 자산의 ipId입니다
main.ts
import { client } from "./utils";
import { zeroAddress, parseEther } from "viem";
import { WIP_TOKEN_ADDRESS } from "@story-protocol/core-sdk";

async function main() {
  // previous code here ...
  const response = await client.royalty.claimAllRevenue({
    ancestorIpId: "0xDa03c4B278AD44f5a669e9b73580F91AeDE0E3B2",
    claimer: "0xDa03c4B278AD44f5a669e9b73580F91AeDE0E3B2",
    currencyTokens: [WIP_TOKEN_ADDRESS],
    childIpIds: [],
    royaltyPolicies: [],
  });

  console.log(`Claimed revenue: ${response.claimedTokens}`);
}

main();

4. 부모가 받을 수익 청구하기

계속해서, 부모도 자신의 수익을 청구할 수 있어야 합니다. 이 예에서 부모는 1 WIPsincethechildearned2WIP since the child earned 2 WIP와 라이선스 조건의 commercialRevShare = 50를 청구할 수 있어야 합니다.

우리는 claimAllRevenue 함수를 사용하여 받을 수익 토큰을 청구할 것입니다.

  1. ancestorIpId는 부모(“조상”) 자산의 ipId입니다
  2. claimer는 부모의 IP Royalty Vault와 관련된 로열티 토큰을 보유하는 주소입니다. 기본적으로, 이들은 IP 계정에 있으며, 이는 단순히 부모 자산의 ipId입니다
  3. childIpIds에는 자식 자산의 ipId가 포함될 것입니다
  4. royaltyPolicies에는 로열티 정책의 주소가 포함될 것입니다. Royalty Module에서 설명한 대로, 이는 RoyaltyPolicyLAP 또는 RoyaltyPolicyLRP입니다. 라이선스 조건에 따라 다릅니다. 이 경우, 라이선스 조건이 RoyaltyPolicyLAP를 지정한다고 가정해 봅시다. 간단히 Deployed Smart Contracts로 가서 올바른 주소를 찾으세요.
  5. currencyTokens는 $WIP의 주소를 포함하는 배열입니다. 이는 here
main.ts
import { client } from "./utils";
import { zeroAddress, parseEther } from "viem";
import { WIP_TOKEN_ADDRESS } from "@story-protocol/core-sdk";

async function main() {
  // previous code here ...

  const response = await client.royalty.claimAllRevenue({
    ancestorIpId: "0x089d75C9b7E441dA3115AF93FF9A855BDdbfe384",
    claimer: "0x089d75C9b7E441dA3115AF93FF9A855BDdbfe384",
    currencyTokens: [WIP_TOKEN_ADDRESS],
    childIpIds: ["0xDa03c4B278AD44f5a669e9b73580F91AeDE0E3B2"],
    royaltyPolicies: ["0xBe54FB168b3c982b7AaE60dB6CF75Bd8447b390E"],
  });

  console.log(`Claimed revenue: ${response.claimedTokens}`);
}

main();

5. 완료!

스마트 컨트랙트 사용하기