forked from fifikobayashi/Debt-Covenant-Contract
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Contract_Registration.js
133 lines (111 loc) · 4.38 KB
/
Contract_Registration.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Debt token creation parameters
const fundingAddress = '...' // SLP address funding the token creation
const FUNDMNEMONIC = '...'; // mnemonic of he address funding the token creation
const fundingWif = '...' // WIF of the address funding token creation in compressed WIF format
const tokenReceiverAddress = '...' // SLP address
const batonReceiverAddress = '...' // SLP address
const bchChangeReceiverAddress = '...' // CASH address
const TOKENNAME = '...'; // e.g. 'DebtToken'
const SYMBOL = '...'; // e.g. DET
const QUANTITY = 100; // initial supply
// Registration parameters
const DebtID = '959632fd0e674a4158d17167b0963f586ec19ffcea204e030d1c1f6541c3348f'; //debt token ID from createToken()
const NETWORK = `testnet`
// Used for debugging and investigating JS objects.
const util = require("util")
util.inspect.defaultOptions = { depth: 1 }
// Instantiate SLP based on the network.
const SLPSDK = require("../../slp-sdk/lib/SLP")
let SLP
if (NETWORK === `mainnet`)
SLP = new SLPSDK({ restURL: `https://rest.bitcoin.com/v2/` })
else SLP = new SLPSDK({ restURL: `https://trest.bitcoin.com/v2/` })
/*
This class creates the SLP debt token, distributes it to the creditors, posts the debt token ID
onchain and sets up the BCH collateral fund for management in Debt_Covenant.js.
*/
registration();
async function registration() {
await createToken();
await registerContract();
await establishCollateral();
}
/*
This function posts the debt token ID onchain via memopress encode.
The .encode() call returns a transaction output and the TX ID is extracted
and stored. For the time being local storage is used to test the POC.
*/
function registerContract() {
// stores the token ID onchain via blockpress
let memopress = require('memopress');
var tx = memopress.encode('0x8d02', DebtID);
console.log('Encode Tx: ' + tx);
// IMPORTANT: always typecast to string via 'hex' otherwise you'll get a capped buffer output
const fs = require('fs');
fs.writeFile('encodetx.txt', tx.toString('hex').match(/../g).join(' '), (err) => {
// In case of a error throw err.
if (err) throw err;
})
}
/*
When CashScript browser support is available this function will facilitate the:
1. creation of the BCH collateral holding
2. transfer the collateral into the fund
3. ensure the covenant will always fail the require() condition in the contract
until floor price has been breached
*/
function establishCollateral() {
// awaiting CashScript browser support
}
/*
Create SLP token function taken from the SLP SDK.
Requires that wallet to have a small BCH balance.
*/
async function createToken() {
try {
// root seed buffer
const rootSeed = SLP.Mnemonic.toSeed(FUNDMNEMONIC)
// master HDNode
let masterHDNode
if (NETWORK === `mainnet`) masterHDNode = SLP.HDNode.fromSeed(rootSeed)
else masterHDNode = SLP.HDNode.fromSeed(rootSeed, "testnet") // Testnet
// HDNode of BIP44 account
const account = SLP.HDNode.derivePath(masterHDNode, "m/44'/145'/0'")
const change = SLP.HDNode.derivePath(account, "0/0")
// get the cash address
const cashAddress = SLP.HDNode.toCashAddress(change)
const slpAddress = SLP.Address.toSLPAddress(cashAddress)
// Create a config object defining the token to be created.
const createConfig = {
fundingAddress,
fundingWif,
tokenReceiverAddress,
batonReceiverAddress,
bchChangeReceiverAddress,
decimals: 4,
name: TOKENNAME,
symbol: SYMBOL,
documentUri: "developer.bitcoin.com",
documentHash: null,
initialTokenQty: QUANTITY
}
// Generate, sign, and broadcast a hex-encoded transaction for creating
// the new token.
const genesisTxId = await SLP.TokenType1.create(createConfig)
console.log(`genesisTxID: ${util.inspect(genesisTxId)}`)
console.log(
`The genesis TxID above is used to uniquely identify your new class of SLP token. Save it and keep it handy.`
)
console.log(` `)
console.log(`View this transaction on the block explorer:`)
if (NETWORK === `mainnet`)
console.log(`https://explorer.bitcoin.com/bch/tx/${genesisTxId}`);
else console.log(`https://explorer.bitcoin.com/tbch/tx/${genesisTxId}`);
} catch (err) {
console.error(`Error in createToken: `, err);
console.log(`Error message: ${err.message}`);
}
}
module.exports = {
registration,
};