@beandao/factorieth

Factorieth Smart Contract Integration Library


Keywords
solidity, ethereum, smart, contracts, security, zeppelin
License
LGPL-3.0
Install
npm install @beandao/factorieth@1.0.0

Documentation

Factori.eth

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปจํŠธ๋ž™ํŠธ๋“ค์„ ์ž‘์€ ์ฝ”๋“œ ํฌ๊ธฐ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ๋ฐฐํฌ๋œ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๊ณตํ†ต๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋ธ”๋ก์ฒด์ธ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š”๋ฐ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

Deployed

Mainnet

  • FactoryV1: 0x7906743465F43fe72Ced0986D62037920929dDC7
    • Price: 0.01 ETH
    • StandardERC20 key: 0xd84f5b1df9c4fd84edcba18d9eec1e0598f898a9d84025ffcd437e0b828fbbe5
    • MerkleDistributor key: 0x27b7cec299fe3e6f5913fa9a95be3169fde20709807359cbdd0a76849bcbe97d
    • VestingEscrow key: 0x8c5d5e4f2902234c981bd69bbfb6bf4cc9e4adbd704d340671dac44dcad3f0d8

Optimism

  • FactoryV1: 0x677ef2B01493e235fE2271AFcd01d7e22975Ce5b
    • Price: 0.001 ETH
    • StandardERC20 key: 0x7f24bd37566ed112a5fd314170e33c8e40c7d269e0edb6191c4bdbb2abe55315
    • L2StandardERC20 key: 0x2aa4348ea67f2b4fb341743986c38b48067fd815ea436e08a922b298733b5442
    • MerkleDistributor key: 0xfe6535b0627e8568ef1eafa214039fd7c90acacd1dc934553a060683d6180097
    • VestingEscrow key: 0x1e568a0b6523217334b8ae190af264b89824c9b23402a2ae782fb93bf6e99ad9

Goerli

  • FactoryV1: 0x131bC833b5857A74466ce61b0A2EE4CFc2436002
    • Price: 0.01 ETH
    • StandardERC20 key: 0x39d750b6e6944bb4361c7379b5f0fa20f77b99adc94192761c67ffd0e3fb04e6
    • MerkleDistributor key: 0x1df4fa81b7029485e75e8567a980cbb02ef58e65fda79384f7df2a0b6f5e9a3a
    • VestingEscrow key: 0x4e2407a6af55c287bda11462e5e0810cdf2cf83c38200c3f0e9cccebe5e96106

Kovan

  • FactoryV1: 0x43ccFa6D2E5cB209a4764Ad1DA46e5B5B32C644D
    • Price: 0.01 ETH
    • StandardERC20 key: 0x9826236a1bc4fc40f2cca879bc5ed99015ca0427eba794e5e6445427acd5055d
    • MerkleDistributor key: 0x5d29e9fad9171dbbd99199b154f79a94c1583ceb907cb2ce6f89b701df69c647
    • VestingEscrow key: 0xc4bfab919fc3beb03ab61980fca95cb2c49aa95c1762e6149adcd3b004266285

Optimism Testnet

  • FactoryV1: 0xd5ac3B857177A0081e2BcF4CAd803e4FE2B5F366
    • Price: 0.001 ETH
    • StandardERC20 key: 0x6108e99ff7450dcaa72e5352300c431df06d6a29f7d4ef425ddd124775b2138c
    • L2StandardERC20 key: 0x7086e604b2f6abf7cd6acd06ac7185589800477c125dccfec0ea104159c12786
    • MerkleDistributor key: 0xe8d3e74813db60888defcb8ab86ac511fce6481052109d6e003ceb2388b6cce8
    • VestingEscrow key: 0xd460dccff7ffce909ad9de70f40f3f2e48e0d4a48374991783a70fbcb5394df3

FactoryV1์„ ํ†ตํ•ด์„œ ํ† ํฐ์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

const ABI = [
    'function initialize(bytes calldata data)',
    'function mintTo(address to, uint256 value)',
    'function transferOwnership(address newOwner)',
];
const interfaces = new ethers.utils.Interface(ABI);

// ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ์ด๋ฆ„
const tokenName = 'TESTToken';
// ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ์‹ฌ๋ณผ
const tokenSymbol = 'TT';
// ํ† ํฐ์˜ ์†Œ์ˆ˜์  ์ž๋ฆฌ
const tokenDecimals = ethers.BigNumber.from('18');
// ์†Œ์ˆ˜์  ์ž๋ฆฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ํ† ํฐ์„ ์ฒ˜์Œ ๋ฐฐํฌํ•  ์ˆซ์ž๋Š” ๋‹ค์Œ์ด ๋ฉ๋‹ˆ๋‹ค. 100.000000000000000000
const initialToken = ethers.BigNumber.from('100000000000000000000');

// ํ† ํฐ์„ ๋ฐฐํฌํ•˜๋ฉด์„œ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™” ํ•ฉ๋‹ˆ๋‹ค.
const initdata = interfaces.encodeFunctionData('initialize', [
    ethers.utils.defaultAbiCoder.encode(['string', 'string', 'uint8'], [tokenName, tokenSymbol, tokenDecimals]),
]);

// ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ํ† ํฐ์„ ์ˆ˜๋ นํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
// ํ•ด๋‹น ์ž‘์—…์œผ๋กœ, ํ† ํฐ ์ˆ˜๋Ÿ‰์ด ๊ฒฐ์ •๋˜๊ณ  ์ด ๊ณต๊ธ‰๋Ÿ‰์ด ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค.
const mintCallData = interfaces.encodeFunctionData('mintTo', [
    'ํ† ํฐ ์ˆ˜๋ น์ธ์˜ ์ด๋”๋ฆฌ์›€ ์ฃผ์†Œ',
    initialToken,
]);

// ๋ฐฐํฌ๋œ ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ์†Œ์œ ๊ถŒ ์ด์ „(์ด ์ž‘์—…์ด ์—†๋‹ค๋ฉด, ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ์†Œ์œ ๊ถŒ์€ factory๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)
// ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ์†Œ์œ ๊ถŒ์ด ์žˆ๋‹ค๋ฉด ์ถ”ํ›„์— ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์†Œ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const ownerCallData = interfaces.encodeFunctionData('transferOwnership', [
    'ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์งˆ ์ด๋”๋ฆฌ์›€ ์ฃผ์†Œ',
]);

const Factory = await ethers.getContractAt(FACTORY_ABI, FACTORY_ADDRESS);

// factory์—์„œ ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ์˜ ํ…œํ”Œ๋ฆฟ ํ‚ค๋ฅผ ๋„ฃ๊ณ , ์ดˆ๊ธฐํ™” ๋ฐ์ดํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ํ•„์š”ํ•œ ํ˜ธ์ถœ์„ ๋ฐฐ์—ดํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
await Factory['deploy(bool,bytes32,bytes,bytes[])'](
    false,
    TOKEN_KEY,
    initdata,
    [mintCallData, ownerCallData],
    { value: ethers.utils.parseEther('0.01') },
);
// tx๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋ฐฐํฌ๋˜์–ด ํ† ํฐ์„ ๋ฐœํ–‰ํ•˜๊ณ  Factory๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์˜ค๋„ˆ์‹ญ์„ ๋„˜๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.