[sui] Sui dx improvement (#1011)
* Use the actual wormhole deployment on testnet for sui testnet config * Simpler deployment script * Bugfix in upgrade payload deserialization * Bugfix in fetching upgrade digest * Small contract manager refactoring and more integration for upgrade script in sui * Remove old scripts * Add script for just generating the sui contract digest * Restrict HotPotatoVector borrow access The return value of `create_price_infos_hot_potato` should not be inspectable outside of the package. * Reorganize the cli lib for sui * Add minimal README for sui cli * Update the general README for sui * Reuse sui sdk logic in contract manager * Manual serialization of accumulator updates for increasing payload size Default payload size seems to be 1024 bytes which is not enough for messages with multiple feeds * Bump sdk version
This commit is contained in:
parent
55129e5b89
commit
b189937365
|
@ -19,10 +19,11 @@
|
||||||
"url": "git+https://github.com/pyth-network/pyth-crosschain.git"
|
"url": "git+https://github.com/pyth-network/pyth-crosschain.git"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mysten/sui.js": "^0.37.1",
|
"@mysten/sui.js": "^0.32.2",
|
||||||
"@certusone/wormhole-sdk": "^0.9.8",
|
"@certusone/wormhole-sdk": "^0.9.8",
|
||||||
"@pythnetwork/cosmwasm-deploy-tools": "*",
|
"@pythnetwork/cosmwasm-deploy-tools": "*",
|
||||||
"@pythnetwork/price-service-client": "*",
|
"@pythnetwork/price-service-client": "*",
|
||||||
|
"@pythnetwork/pyth-sui-js": "*",
|
||||||
"@injectivelabs/networks": "1.0.68",
|
"@injectivelabs/networks": "1.0.68",
|
||||||
"bs58": "^5.0.0",
|
"bs58": "^5.0.0",
|
||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
|
|
|
@ -10,6 +10,7 @@ import {
|
||||||
import { Chain, SuiChain } from "../chains";
|
import { Chain, SuiChain } from "../chains";
|
||||||
import { DataSource } from "xc_admin_common";
|
import { DataSource } from "xc_admin_common";
|
||||||
import { Contract } from "../base";
|
import { Contract } from "../base";
|
||||||
|
import { SuiPythClient } from "@pythnetwork/pyth-sui-js";
|
||||||
|
|
||||||
export class SuiContract extends Contract {
|
export class SuiContract extends Contract {
|
||||||
static type = "SuiContract";
|
static type = "SuiContract";
|
||||||
|
@ -59,27 +60,8 @@ export class SuiContract extends Contract {
|
||||||
* @param objectId
|
* @param objectId
|
||||||
*/
|
*/
|
||||||
async getPackageId(objectId: ObjectId): Promise<ObjectId> {
|
async getPackageId(objectId: ObjectId): Promise<ObjectId> {
|
||||||
const provider = this.getProvider();
|
const client = this.getSdkClient();
|
||||||
const state = await provider
|
return client.getPackageId(objectId);
|
||||||
.getObject({
|
|
||||||
id: objectId,
|
|
||||||
options: {
|
|
||||||
showContent: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((result) => {
|
|
||||||
if (result.data?.content?.dataType == "moveObject") {
|
|
||||||
return result.data.content.fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error("not move object");
|
|
||||||
});
|
|
||||||
|
|
||||||
if ("upgrade_cap" in state) {
|
|
||||||
return state.upgrade_cap.fields.package;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error("upgrade_cap not found");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPythPackageId(): Promise<ObjectId> {
|
async getPythPackageId(): Promise<ObjectId> {
|
||||||
|
@ -132,7 +114,7 @@ export class SuiContract extends Contract {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPriceFeed(feedId: string) {
|
async getPriceFeedObjectId(feedId: string): Promise<ObjectId | undefined> {
|
||||||
const tableId = await this.getPriceTableId();
|
const tableId = await this.getPriceTableId();
|
||||||
const provider = this.getProvider();
|
const provider = this.getProvider();
|
||||||
let result = await provider.getDynamicFieldObject({
|
let result = await provider.getDynamicFieldObject({
|
||||||
|
@ -150,7 +132,13 @@ export class SuiContract extends Contract {
|
||||||
if (result.data.content.dataType !== "moveObject") {
|
if (result.data.content.dataType !== "moveObject") {
|
||||||
throw new Error("Price feed type mismatch");
|
throw new Error("Price feed type mismatch");
|
||||||
}
|
}
|
||||||
let priceInfoObjectId = result.data.content.fields.value;
|
return result.data.content.fields.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getPriceFeed(feedId: string) {
|
||||||
|
const provider = this.getProvider();
|
||||||
|
let priceInfoObjectId = await this.getPriceFeedObjectId(feedId);
|
||||||
|
if (!priceInfoObjectId) return undefined;
|
||||||
let priceInfo = await provider.getObject({
|
let priceInfo = await provider.getObject({
|
||||||
id: priceInfoObjectId,
|
id: priceInfoObjectId,
|
||||||
options: { showContent: true },
|
options: { showContent: true },
|
||||||
|
@ -185,18 +173,60 @@ export class SuiContract extends Contract {
|
||||||
async executeMigrateInstruction(vaa: Buffer, keypair: Ed25519Keypair) {
|
async executeMigrateInstruction(vaa: Buffer, keypair: Ed25519Keypair) {
|
||||||
const tx = new TransactionBlock();
|
const tx = new TransactionBlock();
|
||||||
const packageId = await this.getPythPackageId();
|
const packageId = await this.getPythPackageId();
|
||||||
let decreeReceipt = await this.getVaaDecreeReceipt(tx, packageId, vaa);
|
let verificationReceipt = await this.getVaaVerificationReceipt(
|
||||||
|
tx,
|
||||||
|
packageId,
|
||||||
|
vaa
|
||||||
|
);
|
||||||
|
|
||||||
tx.moveCall({
|
tx.moveCall({
|
||||||
target: `${packageId}::migrate::migrate`,
|
target: `${packageId}::migrate::migrate`,
|
||||||
arguments: [tx.object(this.stateId), decreeReceipt],
|
arguments: [tx.object(this.stateId), verificationReceipt],
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.executeTransaction(tx, keypair);
|
return this.executeTransaction(tx, keypair);
|
||||||
}
|
}
|
||||||
|
|
||||||
async executeUpdatePriceFeed(senderPrivateKey: string, vaas: Buffer[]) {
|
async executeUpdatePriceFeed(senderPrivateKey: string, vaas: Buffer[]) {
|
||||||
throw new Error("Not implemented");
|
// We need the feed ids to be able to execute the transaction
|
||||||
|
// it may be possible to get them from the VAA but in batch transactions,
|
||||||
|
// it is also possible to hava fewer feeds that user wants to update compared to
|
||||||
|
// what exists in the VAA.
|
||||||
|
throw new Error("Use executeUpdatePriceFeedWithFeeds instead");
|
||||||
|
}
|
||||||
|
|
||||||
|
getSdkClient(): SuiPythClient {
|
||||||
|
return new SuiPythClient(
|
||||||
|
this.getProvider(),
|
||||||
|
this.stateId,
|
||||||
|
this.wormholeStateId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async executeUpdatePriceFeedWithFeeds(
|
||||||
|
senderPrivateKey: string,
|
||||||
|
vaas: Buffer[],
|
||||||
|
feedIds: string[]
|
||||||
|
) {
|
||||||
|
const tx = new TransactionBlock();
|
||||||
|
const client = this.getSdkClient();
|
||||||
|
await client.updatePriceFeeds(tx, vaas, feedIds);
|
||||||
|
const keypair = Ed25519Keypair.fromSecretKey(
|
||||||
|
Buffer.from(senderPrivateKey, "hex")
|
||||||
|
);
|
||||||
|
let result = await this.executeTransaction(tx, keypair);
|
||||||
|
return result.digest;
|
||||||
|
}
|
||||||
|
async executeCreatePriceFeed(senderPrivateKey: string, vaas: Buffer[]) {
|
||||||
|
const tx = new TransactionBlock();
|
||||||
|
const client = this.getSdkClient();
|
||||||
|
await client.createPriceFeed(tx, vaas);
|
||||||
|
const keypair = Ed25519Keypair.fromSecretKey(
|
||||||
|
Buffer.from(senderPrivateKey, "hex")
|
||||||
|
);
|
||||||
|
|
||||||
|
let result = await this.executeTransaction(tx, keypair);
|
||||||
|
return result.digest;
|
||||||
}
|
}
|
||||||
|
|
||||||
async executeGovernanceInstruction(senderPrivateKey: string, vaa: Buffer) {
|
async executeGovernanceInstruction(senderPrivateKey: string, vaa: Buffer) {
|
||||||
|
@ -205,11 +235,15 @@ export class SuiContract extends Contract {
|
||||||
);
|
);
|
||||||
const tx = new TransactionBlock();
|
const tx = new TransactionBlock();
|
||||||
const packageId = await this.getPythPackageId();
|
const packageId = await this.getPythPackageId();
|
||||||
let decreeReceipt = await this.getVaaDecreeReceipt(tx, packageId, vaa);
|
let verificationReceipt = await this.getVaaVerificationReceipt(
|
||||||
|
tx,
|
||||||
|
packageId,
|
||||||
|
vaa
|
||||||
|
);
|
||||||
|
|
||||||
tx.moveCall({
|
tx.moveCall({
|
||||||
target: `${packageId}::governance::execute_governance_instruction`,
|
target: `${packageId}::governance::execute_governance_instruction`,
|
||||||
arguments: [tx.object(this.stateId), decreeReceipt],
|
arguments: [tx.object(this.stateId), verificationReceipt],
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.executeTransaction(tx, keypair);
|
return this.executeTransaction(tx, keypair);
|
||||||
|
@ -223,11 +257,15 @@ export class SuiContract extends Contract {
|
||||||
) {
|
) {
|
||||||
const tx = new TransactionBlock();
|
const tx = new TransactionBlock();
|
||||||
const packageId = await this.getPythPackageId();
|
const packageId = await this.getPythPackageId();
|
||||||
let decreeReceipt = await this.getVaaDecreeReceipt(tx, packageId, vaa);
|
let verificationReceipt = await this.getVaaVerificationReceipt(
|
||||||
|
tx,
|
||||||
|
packageId,
|
||||||
|
vaa
|
||||||
|
);
|
||||||
|
|
||||||
const [upgradeTicket] = tx.moveCall({
|
const [upgradeTicket] = tx.moveCall({
|
||||||
target: `${packageId}::contract_upgrade::authorize_upgrade`,
|
target: `${packageId}::contract_upgrade::authorize_upgrade`,
|
||||||
arguments: [tx.object(this.stateId), decreeReceipt],
|
arguments: [tx.object(this.stateId), verificationReceipt],
|
||||||
});
|
});
|
||||||
|
|
||||||
const [upgradeReceipt] = tx.upgrade({
|
const [upgradeReceipt] = tx.upgrade({
|
||||||
|
@ -245,23 +283,19 @@ export class SuiContract extends Contract {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility function to get the decree receipt object for a VAA that can be
|
* Utility function to get the verification receipt object for a VAA that can be
|
||||||
* used to authorize a governance instruction.
|
* used to authorize a governance instruction.
|
||||||
* @param tx
|
* @param tx
|
||||||
* @param packageId pyth package id
|
* @param packageId pyth package id
|
||||||
* @param vaa
|
* @param vaa
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
private async getVaaDecreeReceipt(
|
async getVaaVerificationReceipt(
|
||||||
tx: TransactionBlock,
|
tx: TransactionBlock,
|
||||||
packageId: string,
|
packageId: string,
|
||||||
vaa: Buffer
|
vaa: Buffer
|
||||||
) {
|
) {
|
||||||
const wormholePackageId = await this.getWormholePackageId();
|
const wormholePackageId = await this.getWormholePackageId();
|
||||||
let [decreeTicket] = tx.moveCall({
|
|
||||||
target: `${packageId}::set_update_fee::authorize_governance`,
|
|
||||||
arguments: [tx.object(this.stateId), tx.pure(false)],
|
|
||||||
});
|
|
||||||
|
|
||||||
let [verifiedVAA] = tx.moveCall({
|
let [verifiedVAA] = tx.moveCall({
|
||||||
target: `${wormholePackageId}::vaa::parse_and_verify`,
|
target: `${wormholePackageId}::vaa::parse_and_verify`,
|
||||||
|
@ -272,12 +306,11 @@ export class SuiContract extends Contract {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
let [decreeReceipt] = tx.moveCall({
|
let [verificationReceipt] = tx.moveCall({
|
||||||
target: `${wormholePackageId}::governance_message::verify_vaa`,
|
target: `${packageId}::governance::verify_vaa`,
|
||||||
arguments: [tx.object(this.wormholeStateId), verifiedVAA, decreeTicket],
|
arguments: [tx.object(this.stateId), verifiedVAA],
|
||||||
typeArguments: [`${packageId}::governance_witness::GovernanceWitness`],
|
|
||||||
});
|
});
|
||||||
return decreeReceipt;
|
return verificationReceipt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -361,7 +394,7 @@ export class SuiContract extends Contract {
|
||||||
return Number(fields.last_executed_governance_sequence);
|
return Number(fields.last_executed_governance_sequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
private getProvider() {
|
getProvider() {
|
||||||
return new JsonRpcProvider(new Connection({ fullnode: this.chain.rpcUrl }));
|
return new JsonRpcProvider(new Connection({ fullnode: this.chain.rpcUrl }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,9 +39,10 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certusone/wormhole-sdk": "^0.9.8",
|
"@certusone/wormhole-sdk": "^0.9.8",
|
||||||
"@injectivelabs/networks": "1.0.68",
|
"@injectivelabs/networks": "1.0.68",
|
||||||
"@mysten/sui.js": "^0.37.1",
|
"@mysten/sui.js": "^0.32.2",
|
||||||
"@pythnetwork/cosmwasm-deploy-tools": "*",
|
"@pythnetwork/cosmwasm-deploy-tools": "*",
|
||||||
"@pythnetwork/price-service-client": "*",
|
"@pythnetwork/price-service-client": "*",
|
||||||
|
"@pythnetwork/pyth-sui-js": "*",
|
||||||
"bs58": "^5.0.0",
|
"bs58": "^5.0.0",
|
||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
"typescript": "^4.9.3"
|
"typescript": "^4.9.3"
|
||||||
|
@ -94,38 +95,6 @@
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"contract_manager/node_modules/@certusone/wormhole-sdk/node_modules/@mysten/sui.js": {
|
|
||||||
"version": "0.32.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.32.2.tgz",
|
|
||||||
"integrity": "sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==",
|
|
||||||
"dependencies": {
|
|
||||||
"@mysten/bcs": "0.7.1",
|
|
||||||
"@noble/curves": "^1.0.0",
|
|
||||||
"@noble/hashes": "^1.3.0",
|
|
||||||
"@scure/bip32": "^1.3.0",
|
|
||||||
"@scure/bip39": "^1.2.0",
|
|
||||||
"@suchipi/femver": "^1.0.0",
|
|
||||||
"jayson": "^4.0.0",
|
|
||||||
"rpc-websockets": "^7.5.1",
|
|
||||||
"superstruct": "^1.0.3",
|
|
||||||
"tweetnacl": "^1.0.3"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=16"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"contract_manager/node_modules/@certusone/wormhole-sdk/node_modules/@scure/bip39": {
|
|
||||||
"version": "1.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
|
|
||||||
"integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
|
|
||||||
"dependencies": {
|
|
||||||
"@noble/hashes": "~1.3.0",
|
|
||||||
"@scure/base": "~1.1.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://paulmillr.com/funding/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"contract_manager/node_modules/@certusone/wormhole-sdk/node_modules/bs58": {
|
"contract_manager/node_modules/@certusone/wormhole-sdk/node_modules/bs58": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
|
||||||
|
@ -421,18 +390,18 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"contract_manager/node_modules/@mysten/sui.js": {
|
"contract_manager/node_modules/@mysten/sui.js": {
|
||||||
"version": "0.37.1",
|
"version": "0.32.2",
|
||||||
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.37.1.tgz",
|
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.32.2.tgz",
|
||||||
"integrity": "sha512-nEOqnjUqb/VJcVk23LgZOX1FmBib/mBCwAWaJhtsCHLwv2jIAfCPY/fpB9lJ62QHrM8UFclpWxsLkqcUkKyPgA==",
|
"integrity": "sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mysten/bcs": "0.7.3",
|
"@mysten/bcs": "0.7.1",
|
||||||
"@noble/curves": "^1.0.0",
|
"@noble/curves": "^1.0.0",
|
||||||
"@noble/hashes": "^1.3.0",
|
"@noble/hashes": "^1.3.0",
|
||||||
"@open-rpc/client-js": "^1.8.1",
|
|
||||||
"@scure/bip32": "^1.3.0",
|
"@scure/bip32": "^1.3.0",
|
||||||
"@scure/bip39": "^1.2.0",
|
"@scure/bip39": "^1.2.0",
|
||||||
"@suchipi/femver": "^1.0.0",
|
"@suchipi/femver": "^1.0.0",
|
||||||
"events": "^3.3.0",
|
"jayson": "^4.0.0",
|
||||||
|
"rpc-websockets": "^7.5.1",
|
||||||
"superstruct": "^1.0.3",
|
"superstruct": "^1.0.3",
|
||||||
"tweetnacl": "^1.0.3"
|
"tweetnacl": "^1.0.3"
|
||||||
},
|
},
|
||||||
|
@ -440,14 +409,6 @@
|
||||||
"node": ">=16"
|
"node": ">=16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"contract_manager/node_modules/@mysten/sui.js/node_modules/@mysten/bcs": {
|
|
||||||
"version": "0.7.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.7.3.tgz",
|
|
||||||
"integrity": "sha512-fbusBfsyc2MpTACi72H5edWJ670T84va+qn9jSPpb5BzZ+pzUM1Q0ApPrF5OT+mB1o5Ng+mxPQpBCZQkfiV2TA==",
|
|
||||||
"dependencies": {
|
|
||||||
"bs58": "^5.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"contract_manager/node_modules/@mysten/sui.js/node_modules/@scure/bip39": {
|
"contract_manager/node_modules/@mysten/sui.js/node_modules/@scure/bip39": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
|
||||||
|
@ -11508,54 +11469,6 @@
|
||||||
"@octokit/openapi-types": "^16.0.0"
|
"@octokit/openapi-types": "^16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@open-rpc/client-js": {
|
|
||||||
"version": "1.8.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@open-rpc/client-js/-/client-js-1.8.1.tgz",
|
|
||||||
"integrity": "sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==",
|
|
||||||
"dependencies": {
|
|
||||||
"isomorphic-fetch": "^3.0.0",
|
|
||||||
"isomorphic-ws": "^5.0.0",
|
|
||||||
"strict-event-emitter-types": "^2.0.0",
|
|
||||||
"ws": "^7.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@open-rpc/client-js/node_modules/isomorphic-fetch": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==",
|
|
||||||
"dependencies": {
|
|
||||||
"node-fetch": "^2.6.1",
|
|
||||||
"whatwg-fetch": "^3.4.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@open-rpc/client-js/node_modules/isomorphic-ws": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
|
|
||||||
"peerDependencies": {
|
|
||||||
"ws": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@open-rpc/client-js/node_modules/ws": {
|
|
||||||
"version": "7.5.9",
|
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
|
|
||||||
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8.3.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"bufferutil": "^4.0.1",
|
|
||||||
"utf-8-validate": "^5.0.2"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"bufferutil": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"utf-8-validate": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@openzeppelin/contract-loader": {
|
"node_modules/@openzeppelin/contract-loader": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz",
|
||||||
|
@ -50271,11 +50184,6 @@
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/strict-event-emitter-types": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA=="
|
|
||||||
},
|
|
||||||
"node_modules/strict-uri-encode": {
|
"node_modules/strict-uri-encode": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
|
||||||
|
@ -59663,7 +59571,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"target_chains/sui/sdk/js": {
|
"target_chains/sui/sdk/js": {
|
||||||
"version": "1.0.0",
|
"name": "@pythnetwork/pyth-sui-js",
|
||||||
|
"version": "1.0.1",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mysten/sui.js": "^0.32.2",
|
"@mysten/sui.js": "^0.32.2",
|
||||||
|
@ -67929,40 +67838,6 @@
|
||||||
"@octokit/openapi-types": "^16.0.0"
|
"@octokit/openapi-types": "^16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@open-rpc/client-js": {
|
|
||||||
"version": "1.8.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@open-rpc/client-js/-/client-js-1.8.1.tgz",
|
|
||||||
"integrity": "sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==",
|
|
||||||
"requires": {
|
|
||||||
"isomorphic-fetch": "^3.0.0",
|
|
||||||
"isomorphic-ws": "^5.0.0",
|
|
||||||
"strict-event-emitter-types": "^2.0.0",
|
|
||||||
"ws": "^7.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"isomorphic-fetch": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==",
|
|
||||||
"requires": {
|
|
||||||
"node-fetch": "^2.6.1",
|
|
||||||
"whatwg-fetch": "^3.4.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"isomorphic-ws": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
|
|
||||||
"requires": {}
|
|
||||||
},
|
|
||||||
"ws": {
|
|
||||||
"version": "7.5.9",
|
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
|
|
||||||
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
|
|
||||||
"requires": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@openzeppelin/contract-loader": {
|
"@openzeppelin/contract-loader": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz",
|
||||||
|
@ -82103,9 +81978,10 @@
|
||||||
"requires": {
|
"requires": {
|
||||||
"@certusone/wormhole-sdk": "^0.9.8",
|
"@certusone/wormhole-sdk": "^0.9.8",
|
||||||
"@injectivelabs/networks": "1.0.68",
|
"@injectivelabs/networks": "1.0.68",
|
||||||
"@mysten/sui.js": "^0.37.1",
|
"@mysten/sui.js": "^0.32.2",
|
||||||
"@pythnetwork/cosmwasm-deploy-tools": "*",
|
"@pythnetwork/cosmwasm-deploy-tools": "*",
|
||||||
"@pythnetwork/price-service-client": "*",
|
"@pythnetwork/price-service-client": "*",
|
||||||
|
"@pythnetwork/pyth-sui-js": "*",
|
||||||
"bs58": "^5.0.0",
|
"bs58": "^5.0.0",
|
||||||
"prettier": "^2.6.2",
|
"prettier": "^2.6.2",
|
||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
|
@ -82153,32 +82029,6 @@
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@mysten/sui.js": {
|
|
||||||
"version": "0.32.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.32.2.tgz",
|
|
||||||
"integrity": "sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==",
|
|
||||||
"requires": {
|
|
||||||
"@mysten/bcs": "0.7.1",
|
|
||||||
"@noble/curves": "^1.0.0",
|
|
||||||
"@noble/hashes": "^1.3.0",
|
|
||||||
"@scure/bip32": "^1.3.0",
|
|
||||||
"@scure/bip39": "^1.2.0",
|
|
||||||
"@suchipi/femver": "^1.0.0",
|
|
||||||
"jayson": "^4.0.0",
|
|
||||||
"rpc-websockets": "^7.5.1",
|
|
||||||
"superstruct": "^1.0.3",
|
|
||||||
"tweetnacl": "^1.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@scure/bip39": {
|
|
||||||
"version": "1.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
|
|
||||||
"integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
|
|
||||||
"requires": {
|
|
||||||
"@noble/hashes": "~1.3.0",
|
|
||||||
"@scure/base": "~1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"bs58": {
|
"bs58": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
|
||||||
|
@ -82481,30 +82331,22 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@mysten/sui.js": {
|
"@mysten/sui.js": {
|
||||||
"version": "0.37.1",
|
"version": "0.32.2",
|
||||||
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.37.1.tgz",
|
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.32.2.tgz",
|
||||||
"integrity": "sha512-nEOqnjUqb/VJcVk23LgZOX1FmBib/mBCwAWaJhtsCHLwv2jIAfCPY/fpB9lJ62QHrM8UFclpWxsLkqcUkKyPgA==",
|
"integrity": "sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@mysten/bcs": "0.7.3",
|
"@mysten/bcs": "0.7.1",
|
||||||
"@noble/curves": "^1.0.0",
|
"@noble/curves": "^1.0.0",
|
||||||
"@noble/hashes": "^1.3.0",
|
"@noble/hashes": "^1.3.0",
|
||||||
"@open-rpc/client-js": "^1.8.1",
|
|
||||||
"@scure/bip32": "^1.3.0",
|
"@scure/bip32": "^1.3.0",
|
||||||
"@scure/bip39": "^1.2.0",
|
"@scure/bip39": "^1.2.0",
|
||||||
"@suchipi/femver": "^1.0.0",
|
"@suchipi/femver": "^1.0.0",
|
||||||
"events": "^3.3.0",
|
"jayson": "^4.0.0",
|
||||||
|
"rpc-websockets": "^7.5.1",
|
||||||
"superstruct": "^1.0.3",
|
"superstruct": "^1.0.3",
|
||||||
"tweetnacl": "^1.0.3"
|
"tweetnacl": "^1.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mysten/bcs": {
|
|
||||||
"version": "0.7.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.7.3.tgz",
|
|
||||||
"integrity": "sha512-fbusBfsyc2MpTACi72H5edWJ670T84va+qn9jSPpb5BzZ+pzUM1Q0ApPrF5OT+mB1o5Ng+mxPQpBCZQkfiV2TA==",
|
|
||||||
"requires": {
|
|
||||||
"bs58": "^5.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@scure/bip39": {
|
"@scure/bip39": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
|
||||||
|
@ -103703,11 +103545,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
|
||||||
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
|
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
|
||||||
},
|
},
|
||||||
"strict-event-emitter-types": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA=="
|
|
||||||
},
|
|
||||||
"strict-uri-encode": {
|
"strict-uri-encode": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
|
||||||
|
|
|
@ -55,7 +55,7 @@ Use the hot potato price updates vector to update a price feed.
|
||||||
Note that conventional Pyth price IDs are found [here](https://pyth.network/developers/price-feed-ids#pyth-evm-mainnet).
|
Note that conventional Pyth price IDs are found [here](https://pyth.network/developers/price-feed-ids#pyth-evm-mainnet).
|
||||||
However, instead of passing in a Pyth price feed ID to update the price feed (which is what is done on other chains), one must pass in a `PriceInfoObject` ID instead.
|
However, instead of passing in a Pyth price feed ID to update the price feed (which is what is done on other chains), one must pass in a `PriceInfoObject` ID instead.
|
||||||
|
|
||||||
The `PriceInfoObject` IDs are distinct from Pyth price feed IDs, and are stored in a map on-chain (Pyth price feed ID => PriceInfoObject ID). We pulled this map into a local json file [here](./scripts/generated). The `PriceInfoObject` ID can also be queried on-chain by calling the `pyth::state::get_price_info_object_id` found in the Pyth package. See the common questions section below for more info.
|
The `PriceInfoObject` IDs are distinct from Pyth price feed IDs, and are stored in a map on-chain (Pyth price feed ID => PriceInfoObject ID). The `PriceInfoObject` ID can queried on-chain by calling the `pyth::state::get_price_info_object_id` found in the Pyth package and off-chain by using the js sdk. See the common questions section below for more info.
|
||||||
|
|
||||||
```Rust
|
```Rust
|
||||||
public fun update_single_price_feed(
|
public fun update_single_price_feed(
|
||||||
|
@ -91,39 +91,26 @@ public fun get_price(
|
||||||
|
|
||||||
# 3. Examples
|
# 3. Examples
|
||||||
|
|
||||||
See the `./scripts` folder for examples of programmable transactions for creating price feeds and updating price feeds.
|
See the `cli` folder for examples of programmable transactions for creating price feeds and updating price feeds.
|
||||||
|
|
||||||
- [Demo for updating a price feed](./scripts/pyth/update_price_feeds.ts)
|
- [Demo for updating a price feed](cli/src/update_price_feeds.ts)
|
||||||
|
|
||||||
To build and test the contracts, run the following
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make test
|
|
||||||
$ make build
|
|
||||||
```
|
|
||||||
|
|
||||||
# 4. Contracts Registry
|
# 4. Contracts Registry
|
||||||
|
|
||||||
## Pyth on Testnet
|
## Pyth on Testnet
|
||||||
|
|
||||||
- PYTH_PACKAGE_ID: [0x975e063f398f720af4f33ec06a927f14ea76ca24f7f8dd544aa62ab9d5d15f44](https://explorer.sui.io/object/0x975e063f398f720af4f33ec06a927f14ea76ca24f7f8dd544aa62ab9d5d15f44?network=testnet)
|
|
||||||
- PYTH_STATE_ID: [0xd8afde3a48b4ff7212bd6829a150f43f59043221200d63504d981f62bff2e27a](https://explorer.sui.io/object/0xd8afde3a48b4ff7212bd6829a150f43f59043221200d63504d981f62bff2e27a?network=testnet)
|
- PYTH_STATE_ID: [0xd8afde3a48b4ff7212bd6829a150f43f59043221200d63504d981f62bff2e27a](https://explorer.sui.io/object/0xd8afde3a48b4ff7212bd6829a150f43f59043221200d63504d981f62bff2e27a?network=testnet)
|
||||||
- PYTH_PRICE_FEED_ID_TO_PRICE_INFO_OBJECT_ID: [0xf8929174008c662266a1adde78e1e8e33016eb7ad37d379481e860b911e40ed5](https://explorer.sui.io/object/0xf8929174008c662266a1adde78e1e8e33016eb7ad37d379481e860b911e40ed5?network=https%3A%2F%2Ffullnode.testnet.sui.io%3A443)
|
|
||||||
|
|
||||||
## Wormhole on Testnet
|
## Wormhole on Testnet
|
||||||
|
|
||||||
- WORMHOLE_PACKAGE_ID: [0xcc029e2810f17f9f43f52262f40026a71fbdca40ed3803ad2884994361910b7e](https://explorer.sui.io/object/0xcc029e2810f17f9f43f52262f40026a71fbdca40ed3803ad2884994361910b7e?network=testnet)
|
|
||||||
- WORMHOLE_STATE_ID: [0xebba4cc4d614f7a7cdbe883acc76d1cc767922bc96778e7b68be0d15fce27c02](https://explorer.sui.io/object/0xebba4cc4d614f7a7cdbe883acc76d1cc767922bc96778e7b68be0d15fce27c02?network=testnet)
|
- WORMHOLE_STATE_ID: [0xebba4cc4d614f7a7cdbe883acc76d1cc767922bc96778e7b68be0d15fce27c02](https://explorer.sui.io/object/0xebba4cc4d614f7a7cdbe883acc76d1cc767922bc96778e7b68be0d15fce27c02?network=testnet)
|
||||||
|
|
||||||
## Pyth on Mainnet
|
## Pyth on Mainnet
|
||||||
|
|
||||||
- PYTH_PACKAGE_ID: [0x00b53b0f4174108627fbee72e2498b58d6a2714cded53fac537034c220d26302](https://explorer.sui.io/object/0x00b53b0f4174108627fbee72e2498b58d6a2714cded53fac537034c220d26302?network=https%3A%2F%2Ffullnode.mainnet.sui.io%3A443)
|
|
||||||
- PYTH_STATE_ID: [0xf9ff3ef935ef6cdfb659a203bf2754cebeb63346e29114a535ea6f41315e5a3f](https://explorer.sui.io/object/0xf9ff3ef935ef6cdfb659a203bf2754cebeb63346e29114a535ea6f41315e5a3f?network=https%3A%2F%2Ffullnode.mainnet.sui.io%3A443)
|
- PYTH_STATE_ID: [0xf9ff3ef935ef6cdfb659a203bf2754cebeb63346e29114a535ea6f41315e5a3f](https://explorer.sui.io/object/0xf9ff3ef935ef6cdfb659a203bf2754cebeb63346e29114a535ea6f41315e5a3f?network=https%3A%2F%2Ffullnode.mainnet.sui.io%3A443)
|
||||||
- PYTH_PRICE_FEED_ID_TO_PRICE_INFO_OBJECT_ID: [0x14b4697477d24c30c8eecc31dd1bd49a3115a9fe0db6bd4fd570cf14640b79a0](https://explorer.sui.io/object/0x14b4697477d24c30c8eecc31dd1bd49a3115a9fe0db6bd4fd570cf14640b79a0?network=https%3A%2F%2Ffullnode.mainnet.sui.io%3A443)
|
|
||||||
|
|
||||||
## Wormhole on Mainnet
|
## Wormhole on Mainnet
|
||||||
|
|
||||||
- WORMHOLE_PACKAGE_ID: [0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a](https://explorer.sui.io/object/0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a)
|
|
||||||
- WORMHOLE_STATE_ID: [0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c](https://explorer.sui.io/object/0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c)
|
- WORMHOLE_STATE_ID: [0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c](https://explorer.sui.io/object/0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c)
|
||||||
|
|
||||||
# 5. Common Questions on How to Integrate with Pyth on Sui
|
# 5. Common Questions on How to Integrate with Pyth on Sui
|
||||||
|
@ -146,8 +133,6 @@ rev = "d050ad1d67a5b7da9fb65030aad12ef5d774ccad"
|
||||||
|
|
||||||
## 2. How do I find the Sui Object ID of a PriceInfoObject for a Pyth Price Feed?
|
## 2. How do I find the Sui Object ID of a PriceInfoObject for a Pyth Price Feed?
|
||||||
|
|
||||||
The mapping of Pyth price feed IDs to `PriceInfoObject` object IDs can be found [here](./scripts/generated/). (Note: this may go out of date as more price feeds are introduced and created over time).
|
This mapping is stored on-chain, and can be queried on-chain using the getter function `pyth::state::get_price_info_object_id` defined in the Pyth package.
|
||||||
|
|
||||||
This mapping is also stored on-chain, and can be queried on-chain using the getter function `pyth::state::get_price_info_object_id` defined in the Pyth package.
|
You can also use the sdk utility functions to find the object Ids off-chain.
|
||||||
|
|
||||||
Also recall that the list of Pyth price feed IDs can be found [here](https://pyth.network/developers/price-feed-ids#pyth-evm-testnet).
|
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
# Pre-requisites
|
||||||
|
|
||||||
|
Install move cli according to this [doc](../contracts/README.md)
|
||||||
|
|
||||||
|
# Deploying from scratch
|
||||||
|
|
||||||
|
Configure the `Move.toml` file accordingly. The wormhole address should be specified based on the target chain in the `Move.toml` and the pyth address should be `0x0`.
|
||||||
|
We can deploy the pyth oracle and initialize it with the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run cli -- deploy --private-key <private-key> --chain [sui_mainnet|sui_testnet]
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then add your sui contract configs to the contract manager store.
|
||||||
|
|
||||||
|
You can also manually create all the price feeds available at the moment to make it easier for devs to test the oracle.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run cli -- create-all --private-key <private-key> --contract <contract-id>
|
||||||
|
```
|
||||||
|
|
||||||
|
# Updating price feeds:
|
||||||
|
|
||||||
|
You can use the `create` and `update-feeds` commands to create and update price feeds respectively.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run cli -- create --feed-id <feed-id> --private-key <private-key> --contract <contract-id>
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run cli -- update-feeds --feed-id <feed-id> --private-key <private-key> --contract <contract-id>
|
||||||
|
```
|
||||||
|
|
||||||
|
# Upgrade process:
|
||||||
|
|
||||||
|
The following steps are needed to upgrade our sui contracts:
|
||||||
|
|
||||||
|
- Contract changes:
|
||||||
|
- Create a new struct for the new version and update `current_version` and `previous_version` functions in `version_control` module
|
||||||
|
- Implement any custom logic needed to migrate the data from the old struct to the new one in the `migrate` module
|
||||||
|
- Update dependency (e.g. wormhole) addresses if needed
|
||||||
|
- Generate the digest for the new contract build
|
||||||
|
- Create a governance proposal, proposing the sui package to be upgraded to this specific digest
|
||||||
|
- Approve and execute the governance proposal
|
||||||
|
- Run the upgrade transaction and publish the new package
|
||||||
|
|
||||||
|
## Generating the new contract hash:
|
||||||
|
|
||||||
|
Run the following command to generate the new hash, make sure the contract addresses are idential to the deployed ones:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run cli -- generate-digest
|
||||||
|
```
|
||||||
|
|
||||||
|
## Upgrading the contract
|
||||||
|
|
||||||
|
To upgrade the contract after the governance vaa was executed run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run cli -- upgrade --private-key <private-key> --contract <contract-id> --vaa <upgrade-vaa>
|
||||||
|
```
|
||||||
|
|
||||||
|
The upgrade procedure consists of 2 transactions. The first one is to upgrade the contract (sui level) and the second one is to run the `migrate` function and upgrade the version (package level).
|
||||||
|
Since clients try to fetch the latest version of the package automatically, it's important to run the second transaction as soon as possible after the first one.
|
||||||
|
|
||||||
|
### FAQ:
|
||||||
|
|
||||||
|
- I'm seeting the error `Transaction has non recoverable errors from at least 1/3 of validators`. What should I do?
|
||||||
|
Make sure you have enough funding in the wallet and try again. Usually a more descriptive error message is available in the returned value of the transaction.
|
|
@ -1,9 +1,13 @@
|
||||||
{
|
{
|
||||||
"name": "pyth-sui-integration-test-and-deploy-scripts",
|
"name": "pyth-sui-cli",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "Pyth Sui Integration Tests and Scripts",
|
"description": "Pyth Sui Integration Cli tools",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"license": "MIT",
|
"license": "Apache-2.0",
|
||||||
|
"scripts": {
|
||||||
|
"cli": "ts-node src/cli.ts"
|
||||||
|
},
|
||||||
|
"private": "true",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certusone/wormhole-sdk": "^0.9.12",
|
"@certusone/wormhole-sdk": "^0.9.12",
|
||||||
"@mysten/sui.js": "^0.32.2",
|
"@mysten/sui.js": "^0.32.2",
|
|
@ -0,0 +1,297 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
import yargs from "yargs";
|
||||||
|
import { hideBin } from "yargs/helpers";
|
||||||
|
import {
|
||||||
|
DefaultStore,
|
||||||
|
getDefaultDeploymentConfig,
|
||||||
|
SuiChain,
|
||||||
|
SuiContract,
|
||||||
|
} from "contract_manager";
|
||||||
|
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
||||||
|
import { execSync } from "child_process";
|
||||||
|
import {
|
||||||
|
Connection,
|
||||||
|
Ed25519Keypair,
|
||||||
|
JsonRpcProvider,
|
||||||
|
RawSigner,
|
||||||
|
} from "@mysten/sui.js";
|
||||||
|
import { initPyth, publishPackage } from "./pyth_deploy";
|
||||||
|
import { resolve } from "path";
|
||||||
|
import {
|
||||||
|
buildForBytecodeAndDigest,
|
||||||
|
migratePyth,
|
||||||
|
upgradePyth,
|
||||||
|
} from "./upgrade_pyth";
|
||||||
|
|
||||||
|
const OPTIONS = {
|
||||||
|
"private-key": {
|
||||||
|
type: "string",
|
||||||
|
demandOption: true,
|
||||||
|
desc: "Private key to use to sign transaction",
|
||||||
|
},
|
||||||
|
contract: {
|
||||||
|
type: "string",
|
||||||
|
demandOption: true,
|
||||||
|
desc: "Contract to use for the command (e.g sui_testnet_0xe8c2ddcd5b10e8ed98e53b12fcf8f0f6fd9315f810ae61fa4001858851f21c88)",
|
||||||
|
},
|
||||||
|
path: {
|
||||||
|
type: "string",
|
||||||
|
default: "../../contracts",
|
||||||
|
desc: "Path to the sui contracts, will use ../../contracts by default",
|
||||||
|
},
|
||||||
|
endpoint: {
|
||||||
|
type: "string",
|
||||||
|
desc: "Price service endpoint to use, defaults to https://xc-mainnet.pyth.network for mainnet and https://xc-testnet.pyth.network for testnet",
|
||||||
|
},
|
||||||
|
"feed-id": {
|
||||||
|
type: "array",
|
||||||
|
demandOption: true,
|
||||||
|
desc: "Price feed ids to create without the leading 0x (e.g f9c0172ba10dfa4d19088d94f5bf61d3b54d5bd7483a322a982e1373ee8ea31b). Can be provided multiple times for multiple feed updates",
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
function getContract(contractId: string): SuiContract {
|
||||||
|
const contract = DefaultStore.contracts[contractId] as SuiContract;
|
||||||
|
if (!contract) {
|
||||||
|
throw new Error(`Contract ${contractId} not found`);
|
||||||
|
}
|
||||||
|
return contract;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPriceService(
|
||||||
|
contract: SuiContract,
|
||||||
|
endpointOverride: string | undefined
|
||||||
|
): PriceServiceConnection {
|
||||||
|
const defaultEndpoint = contract.getChain().isMainnet()
|
||||||
|
? "https://hermes.pyth.network"
|
||||||
|
: "https://hermes-beta.pyth.network";
|
||||||
|
return new PriceServiceConnection(endpointOverride || defaultEndpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
yargs(hideBin(process.argv))
|
||||||
|
.command(
|
||||||
|
"create",
|
||||||
|
"Create a new price feed",
|
||||||
|
(yargs) => {
|
||||||
|
return yargs
|
||||||
|
.options({
|
||||||
|
contract: OPTIONS.contract,
|
||||||
|
"feed-id": OPTIONS["feed-id"],
|
||||||
|
"private-key": OPTIONS["private-key"],
|
||||||
|
endpoint: OPTIONS.endpoint,
|
||||||
|
})
|
||||||
|
.usage(
|
||||||
|
"$0 create --contract <contract-id> --feed-id <feed-id> --private-key <private-key>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
async (argv) => {
|
||||||
|
const contract = getContract(argv.contract);
|
||||||
|
const priceService = getPriceService(contract, argv.endpoint);
|
||||||
|
const feedIds = argv["feed-id"] as string[];
|
||||||
|
const vaas = await priceService.getLatestVaas(feedIds);
|
||||||
|
const digest = await contract.executeCreatePriceFeed(
|
||||||
|
argv["private-key"],
|
||||||
|
vaas.map((vaa) => Buffer.from(vaa, "base64"))
|
||||||
|
);
|
||||||
|
console.log("Transaction successful. Digest:", digest);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
"create-all",
|
||||||
|
"Create all price feeds for a contract",
|
||||||
|
(yargs) => {
|
||||||
|
return yargs
|
||||||
|
.options({
|
||||||
|
contract: OPTIONS.contract,
|
||||||
|
"private-key": OPTIONS["private-key"],
|
||||||
|
endpoint: OPTIONS.endpoint,
|
||||||
|
})
|
||||||
|
.usage(
|
||||||
|
"$0 create-all --contract <contract-id> --private-key <private-key>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
async (argv) => {
|
||||||
|
const contract = getContract(argv.contract);
|
||||||
|
const priceService = getPriceService(contract, argv.endpoint);
|
||||||
|
const feedIds = await priceService.getPriceFeedIds();
|
||||||
|
const BATCH_SIZE = 10;
|
||||||
|
for (let i = 0; i < feedIds.length; i += BATCH_SIZE) {
|
||||||
|
const batch = feedIds.slice(i, i + BATCH_SIZE);
|
||||||
|
const vaas = await priceService.getLatestVaas(batch);
|
||||||
|
const digest = await contract.executeCreatePriceFeed(
|
||||||
|
argv["private-key"],
|
||||||
|
vaas.map((vaa) => Buffer.from(vaa, "base64"))
|
||||||
|
);
|
||||||
|
console.log("Transaction successful. Digest:", digest);
|
||||||
|
console.log(`Progress: ${i + BATCH_SIZE}/${feedIds.length}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
"generate-digest",
|
||||||
|
"Generate digest for a contract",
|
||||||
|
(yargs) => {
|
||||||
|
return yargs
|
||||||
|
.options({
|
||||||
|
path: OPTIONS.path,
|
||||||
|
})
|
||||||
|
.usage("$0 generate-digest --path <path-to-contracts>");
|
||||||
|
},
|
||||||
|
async (argv) => {
|
||||||
|
const buildOutput: {
|
||||||
|
modules: string[];
|
||||||
|
dependencies: string[];
|
||||||
|
digest: number[];
|
||||||
|
} = JSON.parse(
|
||||||
|
execSync(
|
||||||
|
`sui move build --dump-bytecode-as-base64 --path ${__dirname}/${argv.path} 2> /dev/null`,
|
||||||
|
{
|
||||||
|
encoding: "utf-8",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
console.log("Contract digest:");
|
||||||
|
console.log(Buffer.from(buildOutput.digest).toString("hex"));
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
"deploy",
|
||||||
|
"Deploy a contract",
|
||||||
|
(yargs) => {
|
||||||
|
return yargs
|
||||||
|
.options({
|
||||||
|
"private-key": OPTIONS["private-key"],
|
||||||
|
chain: {
|
||||||
|
type: "string",
|
||||||
|
demandOption: true,
|
||||||
|
desc: "Chain to deploy the code to. Can be sui_mainnet or sui_testnet",
|
||||||
|
},
|
||||||
|
path: OPTIONS.path,
|
||||||
|
})
|
||||||
|
.usage(
|
||||||
|
"$0 deploy --private-key <private-key> --chain [sui_mainnet|sui_testnet] --path <path-to-contracts>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
async (argv) => {
|
||||||
|
const walletPrivateKey = argv["private-key"];
|
||||||
|
const chain = DefaultStore.chains[argv.chain] as SuiChain;
|
||||||
|
const provider = new JsonRpcProvider(
|
||||||
|
new Connection({ fullnode: chain.rpcUrl })
|
||||||
|
);
|
||||||
|
const wallet = new RawSigner(
|
||||||
|
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
||||||
|
provider
|
||||||
|
);
|
||||||
|
const result = await publishPackage(wallet, argv.path);
|
||||||
|
const deploymentType = chain.isMainnet() ? "stable" : "edge";
|
||||||
|
const config = getDefaultDeploymentConfig(deploymentType);
|
||||||
|
await initPyth(
|
||||||
|
wallet,
|
||||||
|
result.packageId,
|
||||||
|
result.deployerCapId,
|
||||||
|
result.upgradeCapId,
|
||||||
|
config
|
||||||
|
);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
"update-feeds",
|
||||||
|
"Update price feeds for a contract",
|
||||||
|
(yargs) => {
|
||||||
|
return yargs
|
||||||
|
.options({
|
||||||
|
contract: OPTIONS.contract,
|
||||||
|
"feed-id": OPTIONS["feed-id"],
|
||||||
|
"private-key": OPTIONS["private-key"],
|
||||||
|
endpoint: OPTIONS.endpoint,
|
||||||
|
})
|
||||||
|
.usage(
|
||||||
|
"$0 update-feeds --contract <contract-id> --feed-id <feed-id> --private-key <private-key>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
async (argv) => {
|
||||||
|
const contract = getContract(argv.contract);
|
||||||
|
const priceService = getPriceService(contract, argv.endpoint);
|
||||||
|
const feedIds = argv["feed-id"] as string[];
|
||||||
|
const vaas = await priceService.getLatestVaas(feedIds);
|
||||||
|
const digest = await contract.executeUpdatePriceFeedWithFeeds(
|
||||||
|
argv["private-key"],
|
||||||
|
vaas.map((vaa) => Buffer.from(vaa, "base64")),
|
||||||
|
feedIds
|
||||||
|
);
|
||||||
|
console.log("Transaction successful. Digest:", digest);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
"upgrade",
|
||||||
|
"Upgrade a contract",
|
||||||
|
(yargs) => {
|
||||||
|
return yargs
|
||||||
|
.options({
|
||||||
|
"private-key": OPTIONS["private-key"],
|
||||||
|
contract: OPTIONS.contract,
|
||||||
|
vaa: {
|
||||||
|
type: "string",
|
||||||
|
demandOption: true,
|
||||||
|
desc: "Signed Vaa for upgrading the package in hex format",
|
||||||
|
},
|
||||||
|
path: OPTIONS.path,
|
||||||
|
})
|
||||||
|
.usage(
|
||||||
|
"$0 upgrade --private-key <private-key> --contract <contract-id> --vaa <upgrade-vaa>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
async (argv) => {
|
||||||
|
const contract = getContract(argv.contract);
|
||||||
|
|
||||||
|
const wallet = new RawSigner(
|
||||||
|
Ed25519Keypair.fromSecretKey(Buffer.from(argv["private-key"], "hex")),
|
||||||
|
contract.getProvider()
|
||||||
|
);
|
||||||
|
|
||||||
|
const pythContractsPath = resolve(`${__dirname}/${argv.path}`);
|
||||||
|
|
||||||
|
// Build for modules and dependencies
|
||||||
|
const { modules, dependencies, digest } =
|
||||||
|
buildForBytecodeAndDigest(pythContractsPath);
|
||||||
|
//Execute upgrade with signed governance VAA.
|
||||||
|
console.log("Digest is", digest.toString("hex"));
|
||||||
|
const pythPackageOld = await contract.getPackageId(contract.stateId);
|
||||||
|
console.log("Old package id:", pythPackageOld);
|
||||||
|
const signedVaa = Buffer.from(argv.vaa, "hex");
|
||||||
|
const upgradeResults = await upgradePyth(
|
||||||
|
wallet,
|
||||||
|
modules,
|
||||||
|
dependencies,
|
||||||
|
signedVaa,
|
||||||
|
contract
|
||||||
|
);
|
||||||
|
console.log("Tx digest", upgradeResults.digest);
|
||||||
|
if (upgradeResults.effects.status.status !== "success") {
|
||||||
|
throw new Error("Upgrade failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
"Upgrade successful, Executing the migrate function in a separate transaction..."
|
||||||
|
);
|
||||||
|
|
||||||
|
// We can not do the migration in the same transaction since the newly published package is not found
|
||||||
|
// on chain at the beginning of the transaction.
|
||||||
|
|
||||||
|
const migrateResults = await migratePyth(
|
||||||
|
wallet,
|
||||||
|
signedVaa,
|
||||||
|
contract,
|
||||||
|
pythPackageOld
|
||||||
|
);
|
||||||
|
console.log("Tx digest", migrateResults.digest);
|
||||||
|
if (migrateResults.effects.status.status !== "success") {
|
||||||
|
throw new Error(
|
||||||
|
`Migrate failed. Old package id is ${pythPackageOld}. Please do the migration manually`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
console.log("Migrate successful");
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.demandCommand().argv;
|
|
@ -0,0 +1,151 @@
|
||||||
|
import {
|
||||||
|
fromB64,
|
||||||
|
getPublishedObjectChanges,
|
||||||
|
MIST_PER_SUI,
|
||||||
|
normalizeSuiObjectId,
|
||||||
|
RawSigner,
|
||||||
|
TransactionBlock,
|
||||||
|
} from "@mysten/sui.js";
|
||||||
|
import { execSync } from "child_process";
|
||||||
|
import { DataSource } from "xc_admin_common";
|
||||||
|
|
||||||
|
export async function publishPackage(
|
||||||
|
signer: RawSigner,
|
||||||
|
packagePath: string
|
||||||
|
): Promise<{ packageId: string; upgradeCapId: string; deployerCapId: string }> {
|
||||||
|
// Build contracts
|
||||||
|
const buildOutput: {
|
||||||
|
modules: string[];
|
||||||
|
dependencies: string[];
|
||||||
|
} = JSON.parse(
|
||||||
|
execSync(
|
||||||
|
`sui move build --dump-bytecode-as-base64 --path ${__dirname}/${packagePath} 2> /dev/null`,
|
||||||
|
{
|
||||||
|
encoding: "utf-8",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log("buildOutput: ", buildOutput);
|
||||||
|
|
||||||
|
// Publish contracts
|
||||||
|
const transactionBlock = new TransactionBlock();
|
||||||
|
|
||||||
|
transactionBlock.setGasBudget(MIST_PER_SUI / 2n); // 0.5 SUI
|
||||||
|
|
||||||
|
const [upgradeCap] = transactionBlock.publish({
|
||||||
|
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
||||||
|
dependencies: buildOutput.dependencies.map((d: string) =>
|
||||||
|
normalizeSuiObjectId(d)
|
||||||
|
),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Transfer upgrade capability to deployer
|
||||||
|
transactionBlock.transferObjects(
|
||||||
|
[upgradeCap],
|
||||||
|
transactionBlock.pure(await signer.getAddress())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Execute transactions
|
||||||
|
const result = await signer.signAndExecuteTransactionBlock({
|
||||||
|
transactionBlock,
|
||||||
|
options: {
|
||||||
|
showInput: true,
|
||||||
|
showObjectChanges: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const publishEvents = getPublishedObjectChanges(result);
|
||||||
|
if (publishEvents.length !== 1) {
|
||||||
|
throw new Error(
|
||||||
|
"No publish event found in transaction:" +
|
||||||
|
JSON.stringify(result.objectChanges, null, 2)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const packageId = publishEvents[0].packageId;
|
||||||
|
console.log("Published with package id: ", packageId);
|
||||||
|
console.log("Tx digest", result.digest);
|
||||||
|
let upgradeCapId: string | undefined;
|
||||||
|
let deployerCapId: string | undefined;
|
||||||
|
for (const objectChange of result.objectChanges) {
|
||||||
|
if (objectChange.type === "created") {
|
||||||
|
if (objectChange.objectType === "0x2::package::UpgradeCap") {
|
||||||
|
upgradeCapId = objectChange.objectId;
|
||||||
|
}
|
||||||
|
if (objectChange.objectType === `${packageId}::setup::DeployerCap`) {
|
||||||
|
deployerCapId = objectChange.objectId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("UpgradeCapId: ", upgradeCapId);
|
||||||
|
console.log("DeployerCapId: ", deployerCapId);
|
||||||
|
return { packageId, upgradeCapId, deployerCapId };
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function initPyth(
|
||||||
|
signer: RawSigner,
|
||||||
|
pythPackageId: string,
|
||||||
|
deployerCapId: string,
|
||||||
|
upgradeCapId: string,
|
||||||
|
config: {
|
||||||
|
dataSources: DataSource[];
|
||||||
|
governanceDataSource: DataSource;
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
const tx = new TransactionBlock();
|
||||||
|
|
||||||
|
const baseUpdateFee = tx.pure(1);
|
||||||
|
const dataSourceEmitterAddresses = tx.pure(
|
||||||
|
config.dataSources.map((dataSource) => [
|
||||||
|
...Buffer.from(dataSource.emitterAddress, "hex"),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
const dataSourceEmitterChainIds = tx.pure(
|
||||||
|
config.dataSources.map((dataSource) => dataSource.emitterChain)
|
||||||
|
);
|
||||||
|
const governanceEmitterAddress = tx.pure([
|
||||||
|
...Buffer.from(config.governanceDataSource.emitterAddress, "hex"),
|
||||||
|
]);
|
||||||
|
const governanceEmitterChainId = tx.pure(
|
||||||
|
config.governanceDataSource.emitterChain
|
||||||
|
);
|
||||||
|
const stalePriceThreshold = tx.pure(60);
|
||||||
|
tx.moveCall({
|
||||||
|
target: `${pythPackageId}::pyth::init_pyth`,
|
||||||
|
arguments: [
|
||||||
|
tx.object(deployerCapId),
|
||||||
|
tx.object(upgradeCapId),
|
||||||
|
stalePriceThreshold,
|
||||||
|
governanceEmitterChainId,
|
||||||
|
governanceEmitterAddress,
|
||||||
|
dataSourceEmitterChainIds,
|
||||||
|
dataSourceEmitterAddresses,
|
||||||
|
baseUpdateFee,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
tx.setGasBudget(MIST_PER_SUI / 10n); // 0.1 sui
|
||||||
|
|
||||||
|
let result = await signer.signAndExecuteTransactionBlock({
|
||||||
|
transactionBlock: tx,
|
||||||
|
options: {
|
||||||
|
showInput: true,
|
||||||
|
showEffects: true,
|
||||||
|
showEvents: true,
|
||||||
|
showObjectChanges: true,
|
||||||
|
showBalanceChanges: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.effects.status.status === "success") {
|
||||||
|
console.log("Pyth init successful");
|
||||||
|
console.log("Tx digest", result.digest);
|
||||||
|
}
|
||||||
|
for (const objectChange of result.objectChanges) {
|
||||||
|
if (objectChange.type === "created") {
|
||||||
|
if (objectChange.objectType === `${pythPackageId}::state::State`) {
|
||||||
|
console.log("Pyth state id: ", objectChange.objectId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
|
@ -0,0 +1,108 @@
|
||||||
|
import {
|
||||||
|
fromB64,
|
||||||
|
MIST_PER_SUI,
|
||||||
|
normalizeSuiObjectId,
|
||||||
|
RawSigner,
|
||||||
|
TransactionBlock,
|
||||||
|
} from "@mysten/sui.js";
|
||||||
|
import { execSync } from "child_process";
|
||||||
|
import { SuiContract } from "contract_manager";
|
||||||
|
|
||||||
|
export function buildForBytecodeAndDigest(packagePath: string) {
|
||||||
|
const buildOutput: {
|
||||||
|
modules: string[];
|
||||||
|
dependencies: string[];
|
||||||
|
digest: number[];
|
||||||
|
} = JSON.parse(
|
||||||
|
execSync(
|
||||||
|
`sui move build --dump-bytecode-as-base64 -p ${packagePath} 2> /dev/null`,
|
||||||
|
{ encoding: "utf-8" }
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
||||||
|
dependencies: buildOutput.dependencies.map((d: string) =>
|
||||||
|
normalizeSuiObjectId(d)
|
||||||
|
),
|
||||||
|
digest: Buffer.from(buildOutput.digest),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function upgradePyth(
|
||||||
|
signer: RawSigner,
|
||||||
|
modules: number[][],
|
||||||
|
dependencies: string[],
|
||||||
|
signedVaa: Buffer,
|
||||||
|
contract: SuiContract
|
||||||
|
) {
|
||||||
|
const pythPackage = await contract.getPackageId(contract.stateId);
|
||||||
|
|
||||||
|
const tx = new TransactionBlock();
|
||||||
|
const verificationReceipt = await contract.getVaaVerificationReceipt(
|
||||||
|
tx,
|
||||||
|
pythPackage,
|
||||||
|
signedVaa
|
||||||
|
);
|
||||||
|
|
||||||
|
// Authorize upgrade.
|
||||||
|
const [upgradeTicket] = tx.moveCall({
|
||||||
|
target: `${pythPackage}::contract_upgrade::authorize_upgrade`,
|
||||||
|
arguments: [tx.object(contract.stateId), verificationReceipt],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Build and generate modules and dependencies for upgrade.
|
||||||
|
const [upgradeReceipt] = tx.upgrade({
|
||||||
|
modules,
|
||||||
|
dependencies,
|
||||||
|
packageId: pythPackage,
|
||||||
|
ticket: upgradeTicket,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Commit upgrade.
|
||||||
|
tx.moveCall({
|
||||||
|
target: `${pythPackage}::contract_upgrade::commit_upgrade`,
|
||||||
|
arguments: [tx.object(contract.stateId), upgradeReceipt],
|
||||||
|
});
|
||||||
|
|
||||||
|
tx.setGasBudget(MIST_PER_SUI / 4n); // 0.25 SUI
|
||||||
|
|
||||||
|
return signer.signAndExecuteTransactionBlock({
|
||||||
|
transactionBlock: tx,
|
||||||
|
options: {
|
||||||
|
showEffects: true,
|
||||||
|
showEvents: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function migratePyth(
|
||||||
|
signer: RawSigner,
|
||||||
|
signedUpgradeVaa: Buffer,
|
||||||
|
contract: SuiContract,
|
||||||
|
pythPackageOld: string
|
||||||
|
) {
|
||||||
|
const pythPackage = await contract.getPackageId(contract.stateId);
|
||||||
|
const tx = new TransactionBlock();
|
||||||
|
// The pyth package version is not updated yet, therefore we can not get the verification receipts from the new
|
||||||
|
// package yet. We need to use the old package id to get the verification receipt in this transaction and then submit
|
||||||
|
// it to the migrate function in the new package!
|
||||||
|
const verificationReceipt = await contract.getVaaVerificationReceipt(
|
||||||
|
tx,
|
||||||
|
pythPackageOld,
|
||||||
|
signedUpgradeVaa
|
||||||
|
);
|
||||||
|
tx.moveCall({
|
||||||
|
target: `${pythPackage}::migrate::migrate`,
|
||||||
|
arguments: [tx.object(contract.stateId), verificationReceipt],
|
||||||
|
});
|
||||||
|
|
||||||
|
tx.setGasBudget(MIST_PER_SUI / 10n); //0.1 SUI
|
||||||
|
|
||||||
|
return signer.signAndExecuteTransactionBlock({
|
||||||
|
transactionBlock: tx,
|
||||||
|
options: {
|
||||||
|
showEffects: true,
|
||||||
|
showEvents: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ local = "../../../../wormhole/sui/wormhole"
|
||||||
|
|
||||||
[addresses]
|
[addresses]
|
||||||
pyth = "0x0"
|
pyth = "0x0"
|
||||||
wormhole = "0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94"
|
wormhole = "0xcc029e2810f17f9f43f52262f40026a71fbdca40ed3803ad2884994361910b7e"
|
||||||
|
|
||||||
[dev-addresses]
|
[dev-addresses]
|
||||||
pyth = "0x100"
|
pyth = "0x100"
|
||||||
|
|
|
@ -12,7 +12,6 @@ module pyth::contract_upgrade {
|
||||||
use sui::object::{ID};
|
use sui::object::{ID};
|
||||||
use sui::package::{UpgradeReceipt, UpgradeTicket};
|
use sui::package::{UpgradeReceipt, UpgradeTicket};
|
||||||
use wormhole::bytes32::{Self, Bytes32};
|
use wormhole::bytes32::{Self, Bytes32};
|
||||||
use wormhole::bytes::{Self};
|
|
||||||
use wormhole::cursor::{Self};
|
use wormhole::cursor::{Self};
|
||||||
|
|
||||||
use pyth::state::{Self, State};
|
use pyth::state::{Self, State};
|
||||||
|
@ -63,6 +62,13 @@ module pyth::contract_upgrade {
|
||||||
// Update latest executed sequence number to current one.
|
// Update latest executed sequence number to current one.
|
||||||
state::set_last_executed_governance_sequence_unchecked(pyth_state, sequence);
|
state::set_last_executed_governance_sequence_unchecked(pyth_state, sequence);
|
||||||
|
|
||||||
|
let digest = take_upgrade_digest(receipt);
|
||||||
|
// Proceed with processing new implementation version.
|
||||||
|
handle_upgrade_contract(pyth_state, digest)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public(friend) fun take_upgrade_digest(receipt: WormholeVAAVerificationReceipt): Bytes32 {
|
||||||
let payload = governance::take_payload(&receipt);
|
let payload = governance::take_payload(&receipt);
|
||||||
|
|
||||||
let instruction = governance_instruction::from_byte_vec(payload);
|
let instruction = governance_instruction::from_byte_vec(payload);
|
||||||
|
@ -76,13 +82,11 @@ module pyth::contract_upgrade {
|
||||||
assert!(governance_instruction::get_target_chain_id(&instruction) != 0,
|
assert!(governance_instruction::get_target_chain_id(&instruction) != 0,
|
||||||
E_GOVERNANCE_CONTRACT_UPGRADE_CHAIN_ID_ZERO);
|
E_GOVERNANCE_CONTRACT_UPGRADE_CHAIN_ID_ZERO);
|
||||||
|
|
||||||
|
governance::destroy(receipt);
|
||||||
// upgrade_payload contains a 32-byte digest
|
// upgrade_payload contains a 32-byte digest
|
||||||
let upgrade_payload = governance_instruction::destroy(instruction);
|
let upgrade_payload = governance_instruction::destroy(instruction);
|
||||||
|
|
||||||
governance::destroy(receipt);
|
take_digest(upgrade_payload)
|
||||||
|
|
||||||
// Proceed with processing new implementation version.
|
|
||||||
handle_upgrade_contract(pyth_state, upgrade_payload)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finalize the upgrade that ran to produce the given `receipt`. This
|
/// Finalize the upgrade that ran to produce the given `receipt`. This
|
||||||
|
@ -111,18 +115,13 @@ module pyth::contract_upgrade {
|
||||||
|
|
||||||
fun handle_upgrade_contract(
|
fun handle_upgrade_contract(
|
||||||
pyth_state: &mut State,
|
pyth_state: &mut State,
|
||||||
payload: vector<u8>
|
digest: Bytes32
|
||||||
): UpgradeTicket {
|
): UpgradeTicket {
|
||||||
state::authorize_upgrade(pyth_state, take_digest(payload))
|
state::authorize_upgrade(pyth_state, digest)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun deserialize(payload: vector<u8>): UpgradeContract {
|
fun deserialize(payload: vector<u8>): UpgradeContract {
|
||||||
let cur = cursor::new(payload);
|
let cur = cursor::new(payload);
|
||||||
// Pyth upgrade governance message payloads are 40 bytes long. The breakdown looks like
|
|
||||||
// 4 (magic) + 1 (module name) + 1 (action) + 2 (target chain) + 32 (digest)
|
|
||||||
|
|
||||||
bytes::take_bytes(&mut cur, 8); // ignore the first 8 bytes here (they were used for verification in a different code path)
|
|
||||||
// This amount cannot be greater than max u64.
|
|
||||||
let digest = bytes32::take_bytes(&mut cur);
|
let digest = bytes32::take_bytes(&mut cur);
|
||||||
assert!(bytes32::is_nonzero(&digest), E_DIGEST_ZERO_BYTES);
|
assert!(bytes32::is_nonzero(&digest), E_DIGEST_ZERO_BYTES);
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@ module pyth::hot_potato_vector {
|
||||||
const E_EMPTY_HOT_POTATO: u64 = 0;
|
const E_EMPTY_HOT_POTATO: u64 = 0;
|
||||||
|
|
||||||
friend pyth::pyth;
|
friend pyth::pyth;
|
||||||
|
#[test_only]
|
||||||
|
friend pyth::pyth_tests;
|
||||||
|
|
||||||
// A hot potato containing a vector of elements
|
// A hot potato containing a vector of elements
|
||||||
struct HotPotatoVector<T: copy + drop> {
|
struct HotPotatoVector<T: copy + drop> {
|
||||||
|
@ -32,7 +34,7 @@ module pyth::hot_potato_vector {
|
||||||
vector::is_empty(&potato.contents)
|
vector::is_empty(&potato.contents)
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun borrow<T: copy + drop>(potato: &HotPotatoVector<T>, i: u64): &T {
|
public(friend) fun borrow<T: copy + drop>(potato: &HotPotatoVector<T>, i: u64): &T {
|
||||||
vector::borrow<T>(&potato.contents, i)
|
vector::borrow<T>(&potato.contents, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ module pyth::migrate {
|
||||||
|
|
||||||
use pyth::state::{Self, State};
|
use pyth::state::{Self, State};
|
||||||
use pyth::contract_upgrade::{Self};
|
use pyth::contract_upgrade::{Self};
|
||||||
use pyth::governance::{Self, WormholeVAAVerificationReceipt};
|
use pyth::governance::{WormholeVAAVerificationReceipt};
|
||||||
|
|
||||||
struct MigrateComplete has drop, copy {
|
struct MigrateComplete has drop, copy {
|
||||||
package: ID
|
package: ID
|
||||||
|
@ -58,19 +58,13 @@ module pyth::migrate {
|
||||||
// This capability ensures that the current build version is used.
|
// This capability ensures that the current build version is used.
|
||||||
let latest_only = state::assert_latest_only(pyth_state);
|
let latest_only = state::assert_latest_only(pyth_state);
|
||||||
|
|
||||||
// Check if build digest is the current one.
|
let digest = contract_upgrade::take_upgrade_digest(receipt);
|
||||||
let digest =
|
|
||||||
contract_upgrade::take_digest(
|
|
||||||
governance::take_payload(&receipt)
|
|
||||||
);
|
|
||||||
state::assert_authorized_digest(
|
state::assert_authorized_digest(
|
||||||
&latest_only,
|
&latest_only,
|
||||||
pyth_state,
|
pyth_state,
|
||||||
digest
|
digest
|
||||||
);
|
);
|
||||||
|
|
||||||
governance::destroy(receipt);
|
|
||||||
|
|
||||||
// Finally emit an event reflecting a successful migrate.
|
// Finally emit an event reflecting a successful migrate.
|
||||||
let package = state::current_package(&latest_only, pyth_state);
|
let package = state::current_package(&latest_only, pyth_state);
|
||||||
sui::event::emit(MigrateComplete { package });
|
sui::event::emit(MigrateComplete { package });
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm -rf node_modules
|
|
||||||
|
|
||||||
node_modules:
|
|
||||||
npm ci
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
## Run tests
|
|
||||||
test: node_modules
|
|
||||||
bash run_integration_test.sh
|
|
|
@ -1,243 +0,0 @@
|
||||||
{
|
|
||||||
"b881c6dad5dd3dc9a83222f8032fb439859288119afc742d43adc305cef151cc": "0x48f5e34e3bf1536cbb100ce9bda1eeb63b414ca4bfc2b3da64b7899c1b68bce1",
|
|
||||||
"23245bb74254e65a98cc3ff4a37443d79f527e44e449750ad304538b006f21bc": "0x73c2acb6e4ef06b3ac2290c2dbbdf2c4e18f128c3c35d2e3cd7bc72064c53a11",
|
|
||||||
"ed5c2a2711e2a638573add9a8aded37028aea4ac69f1431a1ced9d9db61b2225": "0x2509cb1db4940adb0455408d60ba2e8d90ba5ce9e1917fc663333a5ab561d526",
|
|
||||||
"cfd44471407f4da89d469242546bb56f5c626d5bef9bd8b9327783065b43c3ef": "0xe77ee43c45c2e8a3fc1b2c436f53752380ae9a37b9cac474cb3c49be08f55fc4",
|
|
||||||
"27d108eb764c912f49d3453a21dd95516619b1c45d0b607ee58a137ac8a6f32d": "0xe36fb48cdcd0b53538df43ce800cd1e00005b8bcfd0814dfc4463cf834d90b45",
|
|
||||||
"1dcf38b0206d27849b0fcb8d2df21aff4f95873cce223f49d7c1ea3c5145ec63": "0x3de2560b78bc990225b894304cd178d2eafe08ea9afaa6413d271223527f5951",
|
|
||||||
"b962539d0fcb272a494d65ea56f94851c2bcf8823935da05bd628916e2e9edbf": "0xfa16594fccd3a1ebe33472ef3992de100ab054ec2a217240680482a538b4c336",
|
|
||||||
"20d096e088a9b85f8cf09278965b77aeb05c00769e2ddeda5ea2d07ea554b283": "0x8367e3bb78392d6a4a491355a8d1e9c21aa1cd8273c7e0df81d122814e9dd7c8",
|
|
||||||
"67be9f519b95cf24338801051f9a808eff0a578ccb388db73b7f6fe1de019ffb": "0x931d4ed5776656216c4df13bcd98d39c4cf4ee07d1549cbb21768b2c2a661ae0",
|
|
||||||
"ad2fda41998f4e7be99a2a7b27273bd16f183d9adfc014a4f5e5d3d6cd519bf4": "0xa8ede0347676f90f35b32f02006f1b377cfcc5a97c378c3c55d19785d4862424",
|
|
||||||
"d1d95644ffc11ca502f21e067a7814144c56b37018515ced4335a886a827a305": "0xf43077d4591363033422295f7d057c91f274428e84df0052087d52a8ddf75853",
|
|
||||||
"d0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ded4d1": "0xf72465b8208bdbe15901d3861be0d7a3f897b871a88f7dd9374bcba1fa9a70aa",
|
|
||||||
"78a3e3b8e676a8f73c439f5d749737034b139bbbe899ba5775216fba596607fe": "0xb7327d2ae15cc451cef7e9d639ab762f23f888b2e6357ace28dd40370a04f0be",
|
|
||||||
"6ed3c7c4427ae2f91707495fc5a891b30795d93dbb3931782ddd77a5d8cb6db7": "0x7adc4863905768dd4d2fddab7161a8c8cc4232763f7eb5f7af60d7b0dac7e1b1",
|
|
||||||
"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b": "0x64f8db86bef3603472cf446c7ab40278af7f4bcda97c7599ad4cb33d228e31eb",
|
|
||||||
"681e0eb7acf9a2a3384927684d932560fb6f67c6beb21baa0f110e993b265386": "0x977dc5e935767f31254d1f30c1190f82c1b30748650507382d4b99233b61356b",
|
|
||||||
"43cddc3e1d0b17fec1cf2a230f46e9319887a037dcee56e053af44d8259fb042": "0x4ce39ace836e4ab1a534fc80a1da1ea7b1a543cb53c0a524bc6b412ffac9e3aa",
|
|
||||||
"159b09ed169a3cdbd13fd96ef4b3cda54972058906d38a58f5cd327e5df1478b": "0x45cf00d0ec9bd998b4b98193f8cb94960bcff8f7b710f7bb6a9251db1a1e3a7c",
|
|
||||||
"ad04597ba688c350a97265fcb60585d6a80ebd37e147b817c94f101a32e58b4c": "0xbfda14b522c592ed05187d411822a43d966290519545165a759db2c99f8e04ba",
|
|
||||||
"8086320540b3d7b9b4b564e6756a29a9cb91a7cd97d5fafff63841959d3a09a0": "0x82b1c5f3f6b19b462d390041d753e8c91ae7adefb19b3d0200f76331d0f3d870",
|
|
||||||
"2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f": "0xf77ffef808c70726cf3194275d2b2562c6e107130188f81684b184081f380e7b",
|
|
||||||
"301377b122716cee1a498e7930a1836c0b1db84667cc78bbbcbad6c330ea6afb": "0x276ebfe4c08088769193d92d601cd1bab347e9969ca26f2aae27e3c787b10577",
|
|
||||||
"0afa3199e0899270a74ddcf5cc960d3c6c4414b4ca71024af1a62786dd24f52a": "0xd2ec9b5cc02a4a5f2b99739cd2021048a8b8fdff0d718e21b3f2d6347c15802f",
|
|
||||||
"6672325a220c0ee1166add709d5ba2e51c185888360c01edc76293257ef68b58": "0xce3d0a61496bfe275a0743753192f9fd99e08c6f9e515d29d75b9bb491795b3c",
|
|
||||||
"856aac602516addee497edf6f50d39e8c95ae5fb0da1ed434a8c2ab9c3e877e9": "0x84d1121e33ead9dc597fc8783046ef62917138ddec8ace9f096a8ab05408d627",
|
|
||||||
"e0f87bbde799f33615b83a601b66415e850788000cd7286a3e7295f23c1bb353": "0x8e37e4b5165f1ecc27b9293c262efee4b48ed888eb24eb52003db8c4e30a7e6e",
|
|
||||||
"fd0690232b0fae5efdc402c1b9aac74176383ff7daf87d021554bda24a38e0ec": "0x24773694c342902c90bab3f9989cf07a3acdcbad43bd15fc6b2fa5e3a7bf6725",
|
|
||||||
"a4702f0f5818258783a1e47f453cb20b0fbec32ca67260e1d19dfcdd6a4d0ebb": "0xfc81ec2ea856badef5646309cd7cba2b39365b40d76b2e9d73ace9ddc78ebbd5",
|
|
||||||
"91568baa8beb53db23eb3fb7f22c6e8bd303d103919e19733f2bb642d3e7987a": "0x6a067510a352ca827ba34f297b5a36c11da0509848d4d32895ec38ceeb9f2fe3",
|
|
||||||
"4b1ddc065d08214eb06878d6130a66665febc3fd201733e9bb481094b5de8a32": "0x781d74ce86520529492844dbb355746d7f452b9bcb56f1df9c66458f4683b334",
|
|
||||||
"16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1": "0xd3b0babf4b63fcd84e8fb345ed947dc42687d64c0d3ab9bcb19aefcba5edee65",
|
|
||||||
"ccca1d2b0d9a9ca72aa2c849329520a378aea0ec7ef14497e67da4050d6cf578": "0x37584366e4c87d0db4f0fe8f5bea2913bb17b540efae87c734df2e84b7f8132a",
|
|
||||||
"9c68c0c6999765cf6e27adf75ed551b34403126d3b0d5b686a2addb147ed4554": "0xe54f04f1c67ad0735377696e85e1459ba2331aaaf1939ea2764c70ba3e626fb3",
|
|
||||||
"107918baaaafb79cd9df1c8369e44ac21136d95f3ca33f2373b78f24ba1e3e6a": "0x368c16d65559ba370d3b482facd2f271cabcce8d51981f19adcc798da566f5a5",
|
|
||||||
"8cdc9b2118d2ce55a299f8f1d700d0127cf4036d1aa666a8cd51dcab4254284f": "0xea0a0193fd43846748c3db56ecf88d265678a41fe060c647d9b61e93ced3a1e9",
|
|
||||||
"9fb0bd29fe51481b61df41e650346cc374b13c2bab2e3610364cd834a592025a": "0xfc34f68e8cbe453be14c11da50cf3e40860b76423f4a760bb219882fde2f5a1d",
|
|
||||||
"5a5d5f7fb72cc84b579d74d1c06d258d751962e9a010c0b1cce7e6023aacb71b": "0x7b8c7ef3bfd8144689d1140d6426a8e1be434942c6668a8a49587fdfc2021af7",
|
|
||||||
"2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445": "0x390b072dded78dfff1ea173b38c66381e5f3f9efe7518cb35225a9c3f9a459dd",
|
|
||||||
"6e89dbed2351e3c85a9ce1c782ca1e34b6ef2c4775f1cb691739bbe6d0697e86": "0x6472958c67e43b2152c16673bd0089f8d1b554e44ebc66123cc2b90826e917a3",
|
|
||||||
"a0255134973f4fdf2f8f7808354274a3b1ebc6ee438be898d045e8b56ba1fe13": "0x12b26a12f52efb34f92b9fd5276b279d780e6290ca9694ddc5c914ca21f6bc5b",
|
|
||||||
"fee33f2a978bf32dd6b662b65ba8083c6773b494f8401194ec1870c640860245": "0xf07b1bc4a2e57f6689fac5e6f45d849684e04c48ed14cfcdf9d0f92a3c0d6750",
|
|
||||||
"7a5bc1d2b56ad029048cd63964b3ad2776eadf812edc1a43a31406cb54bff592": "0x9b200f90ce60bad205b173a5d93d7735216651056b1aa417cd43548cb1e296c9",
|
|
||||||
"9ff7b9a93df40f6d7edc8184173c50f4ae72152c6142f001e8202a26f951d710": "0x1c896b841e04ae645f153f5fff69ff2decd5887bedd50ef35ed9366a9504d5be",
|
|
||||||
"150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e": "0xf98966d481a43b21390217c32bd1cf1b5bda9e30a4e17813ba74a607348db110",
|
|
||||||
"7f4f157e57bfcccd934c566df536f34933e74338fe241a5425ce561acdab164e": "0x8d4475caa70fed009c5cb2409319241a87483a32e2e39a49b41d49789a2c6290",
|
|
||||||
"a995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b": "0x314f17766eea028b392afa591bc73dc088373401105a1b5b7696d77ea2eca60e",
|
|
||||||
"649fdd7ec08e8e2a20f425729854e90293dcbe2376abc47197a14da6ff339756": "0x14fca9ac00d16ddf02bc7d09434ac9e0648b033b6fec8cff25b9c4086bf5bbef",
|
|
||||||
"f0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a": "0x4c1ea5bf7298087455ff3e304071483d898428d492982ebe96bede528878cab1",
|
|
||||||
"2f2d17abbc1e781bd87b4a5d52c8b2856886f5c482fa3593cebf6795040ab0b6": "0x5d7abbc0984b102d24d8c799f62336966063cbb63b2443e2b0edc7ee1a502fab",
|
|
||||||
"be4cb6bf8f18e84b1c4fd6fafa7f048a972be26505bd58338eb66c80faa99483": "0x2461d2c70b6bb5fda512fcc3d3e5905cd1601c76754b9aef68ff77099ab8a01a",
|
|
||||||
"ee42016c303126bd9263724e00f83a8114e84518c6e8ffc9738c001cc301daff": "0x99a31d27d382e65e7e4f83a8f9a3e0306244ac26a6b60b0c233aaa573399edfc",
|
|
||||||
"4457960559b812558bb0f8cb7912f8bcb843eb801a3133ef45be998630ff8c05": "0xda3bf400551387e59d18867b22b00184ca277d048413bfb8a456464e23039818",
|
|
||||||
"7f981f906d7cfe93f618804f1de89e0199ead306edc022d3230b3e8305f391b0": "0xea316baa91d450f8cac1cda7cc1e85203094bb447e1a8fa606142e552a1bef9b",
|
|
||||||
"4176cd17d4a1fb517b6535e70084ce85e1bcbe707c66b960c8bd5256accc1b2d": "0x6bb4c17ea9aab309528c2dd209bcc43964fe7e61944816764402aea5be89bd28",
|
|
||||||
"b0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd": "0xbf66ce3ec6cc8b96a96c394d224458ba1245e0bd8d7b2ef26b2dabde7201ab90",
|
|
||||||
"84c2dde9633d93d1bcad84e7dc41c9d56578b7ec52fabedc1f335d673df0a7c1": "0xe629bee77fa0153cc95381c03874ea40b2606045754846329056953da91ec737",
|
|
||||||
"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace": "0xaa6adc565636860729907ef3e7fb7808d80c8a425a5fd417ae47bb68e2dcc2e3",
|
|
||||||
"48ce0cf436bac22dad33551dfe2eb7bf9991e419a05f25aed4e90c29c3a1cdbe": "0xea3c73b52093cce7bfc6268b2f3ac98a9d5c6b29b73ff8531e9cb367534c5601",
|
|
||||||
"39d020f60982ed892abbcd4a06a276a9f9b7bfbce003204c110b6e488f502da3": "0xa0f1dd0f63f4433cee07ae3252aa2932adec74ca9c0e9cc3940b941c43b65d59",
|
|
||||||
"0b46c1c04e9c914037cc4e0561a7e6787f6db0b89b7b65281f0f6fea1ce45a74": "0x0ae0bdcaf4d5d8a598088b662484d14b70ff87ce03a85991cdb2c97b6adad694",
|
|
||||||
"49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688": "0xea058b780d7d736034902dc429ef09d2a3bf79045f467b21281de049b007f0f1",
|
|
||||||
"89a58e1cab821118133d6831f5018fba5b354afb78b2d18f575b3cbf69a4f652": "0xd64cdf76087a1e758220bfc42c932166c948389b55cb57d7ba084b43c550c447",
|
|
||||||
"9c479b12a2b2c1051715d4d462dd7a6abbb6dccabf3af31a53f6130a1cd88efc": "0xd7b38060426a5d4202f070c43cd95eeaca0118d73037de110493a2a7d1e68db2",
|
|
||||||
"c7b72e5d860034288c9335d4d325da4272fe50c92ab72249d58f6cbba30e4c44": "0x32cc9edcff5da777e082683ff0f74e402df4f405d23440d4a178160742b22ee8",
|
|
||||||
"6aac625e125ada0d2a6b98316493256ca733a5808cd34ccef79b0e28c64d1e76": "0xc669349fbdd7ee4bb414d6b2f369c795d02d5a0032fcde020a69bc58767e8679",
|
|
||||||
"ef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52": "0x7fe7a7a217ab0c41603b1447c342fcbe4d053a5e4545712ee4ba9c8597c5dcd5",
|
|
||||||
"97d7d4c20e5a06fdb60f7a448a9e9a779f2b31c3f21121180010a4a470844aae": "0x3a3bf114e8d1d6f7b183c1fd93e6fcd1262bd935e41299beaa3fba30a57d921c",
|
|
||||||
"097d687437374051c75160d648800f021086bc8edf469f11284491fda8192315": "0xd95ccf9ad19161a11d6c89d7d01183b8ada8de019097ffb59cae0017374fd8c2",
|
|
||||||
"a5eb88d3ea93f6240d7e54b4466bc1857f7bfc1658d49a07f68096ebc0fdde3b": "0xb7bd68342d5a4dcb179a0d5671b02c1ecc0a3541070319837a062c871a5c34b4",
|
|
||||||
"846ae1bdb6300b817cee5fdee2a6da192775030db5615b94a465f53bd40850b5": "0xcbf9dfb457aa8d1e3133f74a9dda1f35a8dee4389f94058440b8e41a551c5e91",
|
|
||||||
"f464e36fd4ef2f1c3dc30801a9ab470dcdaaa0af14dd3cf6ae17a7fca9e051c5": "0x6019d9c0076ca9ae62e115a5649cba5b6ae0206d887b5def93e4bb3ba00bcb7b",
|
|
||||||
"b3a83dbe70b62241b0f916212e097465a1b31085fa30da3342dd35468ca17ca5": "0xfee4a508e0dfcc4aa01eb0cca214a5aa7de4b96a385cb0aa1a972a81b792601a",
|
|
||||||
"c3d5d8d6d17081b3d0bbca6e2fa3a6704bb9a9561d9f9e1dc52db47629f862ad": "0xd910c7feef2f7f2202b7ddde218c9dc2e38f9b6c6a8b57baa6f303fd34909786",
|
|
||||||
"8e860fb74e60e5736b455d82f60b3728049c348e94961add5f961b02fdee2535": "0x4fdd926d2de6856e517e8971bb31cdbc7a56ecc00bdaa6465d275dac3facdd58",
|
|
||||||
"e6ccd3f878cf338e6732bf59f60943e8ca2c28402fc4d9c258503b2edbe74a31": "0x7132045789988836fcce1b6d616d4d3b127d514b3ad3cb35ba88f2900ee705e6",
|
|
||||||
"b5d0e0fa58a1f8b81498ae670ce93c872d14434b72c364885d4fa1b257cbb07a": "0xe898823694bee196292d219705cd0beb35525801b85375591fc6a44cf55d3b20",
|
|
||||||
"3b7ef6c95ceedbffbb66bff3d6135a200c5d0a0466b0c90812510ceaedebaf04": "0x4fe43d8860dc2110f94d9e83823732fa4b0c0dce02649d16d679660f4f50fcae",
|
|
||||||
"765f416f2d676848b5016428bc9295fda3e71d5e97b16df75179a378cef040ec": "0xf434ab996f77c767e2a87dead8cac87be37aff047747051b415fd4a2618fe8f5",
|
|
||||||
"c7c60099c12805bea1ae4df2243d6fe72b63be3adeb2208195e844734219967b": "0x9d63a5134e732db8a63dfa10ab019deb24397de7f2058d4209167bbbada3d33f",
|
|
||||||
"c80657b7f6f3eac27218d09d5a4e54e47b25768d9f5e10ac15fe2cf900881400": "0x254241ea8359518d79c52e64589e147a0447e6c35f33de677a00175061b464e5",
|
|
||||||
"8f218655050a1476b780185e89f19d2b1e1f49e9bd629efad6ac547a946bf6ab": "0x3416a6939f558a9617a99d12179268f702d39fc408458d70c284de1a80a1c49c",
|
|
||||||
"f2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e": "0x48f1db8eec5885a546e12c19d67f4547859fea650015b48454cfc5c79d394279",
|
|
||||||
"396a969a9c1480fa15ed50bc59149e2c0075a72fe8f458ed941ddec48bdb4918": "0x23b2225a09c417d565c77fb0b3e036d8d5aebbedf91cb1953d80ce5292cd97f6",
|
|
||||||
"abe4f2b264560a397f38eec024369356e5c1ea4f7aab94729369f144b3d97779": "0x1a4e036ba74b664ba89ec19239a575288fbecfdb7a79d3064791736f67cd2608",
|
|
||||||
"c63e2a7f37a04e5e614c07238bedb25dcc38927fba8fe890597a593c0b2fa4ad": "0x31529ae63c25966bdb44728d3b9f85a492b128695c1b5bb023430095f8259a53",
|
|
||||||
"81a21b01c15b8d01f6cdfed65e00987cc4c901858c821b2089344987de3102e9": "0x63220e064b5aea996231271af99fbb95ca20100adc038f3a70216af85b46abb8",
|
|
||||||
"a19d04ac696c7a6616d291c7e5d1377cc8be437c327b75adb5dc1bad745fcae8": "0xb1ce7fc4ff77674c1cd0b55b7b11d512136b1c255dfe40855d802242a801c2d9",
|
|
||||||
"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419": "0xc2eefebf46c00bd270b796d1c2b13aca776d4ed71987e735aaa1af2ca5a6b54b",
|
|
||||||
"03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5": "0x02ed0bfc818a060e1378eccda6a6c1dc6b4360b499bdaa23e3c69bb9ba2bfc96",
|
|
||||||
"ef94acc2fb09eb976c6eb3000bab898cab891d5b800702cd1dc88e61d7c3c5e6": "0xcad9824dd299c55b10085cc2822d82d2b95c6af6d577a784389abb036096bcb7",
|
|
||||||
"59671f59d12dc81bae078754b7469c7434528a66d3fa91193cf204460c198f9b": "0x2b60d6a87f7d6151b264deb533964622d1492f9f1632554d9213fa51e8f7a92c",
|
|
||||||
"433faaa801ecdb6618e3897177a118b273a8e18cc3ff545aadfc207d58d028f7": "0xb6c57f055c5919d2da8466fa2d47f4a0fce2552ee1999a2fe7618482ce0d9522",
|
|
||||||
"6d20210495d6518787b72e4ad06bc4df21e68d89a802cf6bced2fca6c29652a6": "0x30608417f9615779db05cd6f4614590a3fcf6c90516c84b93867612c57dba097",
|
|
||||||
"07ad7b4a7662d19a6bc675f6b467172d2f3947fa653ca97555a9b20236406628": "0x973f63c3f232ffaae67e03df9d6b44edba596334d286da2d5920abbf610387bb",
|
|
||||||
"f3b50961ff387a3d68217e2715637d0add6013e7ecb83c36ae8062f97c46929e": "0xb6010b008fb1f6acc6bcf7abc42260fd2fdeb1575b0c27473874ec8a3b074247",
|
|
||||||
"8ccb376aa871517e807358d4e3cf0bc7fe4950474dbe6c9ffc21ef64e43fc676": "0xac6f489810c5f6964d20f1d87cb6b37592a6aba39a1f4b038666a7e2fc17365b",
|
|
||||||
"235ddea9f40e9af5814dbcc83a418b98e3ee8df1e34e1ae4d45cf5de596023a3": "0xab38f39c828bd1c2fbe8f427115504d75dcb189a7b701d6da9af86de841fe768",
|
|
||||||
"ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8": "0x9ed686fd3b795de6185329add2fe0f5e4f907c08d20be5f06c94c012000535c4",
|
|
||||||
"5b70af49d639eefe11f20df47a0c0760123291bb5bc55053faf797d1ff905983": "0x8872e6fecf82d40ca53fdba9d75d09129a94e76159b589c78d86382fa8043ead",
|
|
||||||
"7d669ddcdd23d9ef1fa9a9cc022ba055ec900e91c4cb960f3c20429d4447a411": "0xbca1fe1bb1e6a70085c45e757355ef184e786172c66a6e10612e18822a2d5f31",
|
|
||||||
"c1751e085ee292b8b3b9dd122a135614485a201c35dfc653553f0e28c1baf3ff": "0x47cb9e798c09e1c77ee587be91b66cdf2a6cab3aba040bfa8596653ed9bc6441",
|
|
||||||
"a639c04942ebfdeabf25bf1b88d6608ef387219748d77ea130bc2fa486b9614f": "0x8d91ed026578b6a09bf951ba088e05e37b9fa3282796d0868b6b35b5dc9a5278",
|
|
||||||
"3dd2b63686a450ec7290df3a1e0b583c0481f651351edfa7636f39aed55cf8a3": "0x879116097aee056f838b7c84ea1380f585e01a8cf34d3cc57849930c9c03674b",
|
|
||||||
"8ff1200345393bb25be4f4eeb2d97234e91f7e6213f3745a694b1436e700f271": "0xaed6e775060949dc0672f12b7f4b3960d65ff47689a0411ce3c8c735db8ba099",
|
|
||||||
"c415de8d2eba7db216527dff4b60e8f3a5311c740dadb233e13e12547e226750": "0xdcdb26f005d8e4b0820a3c99b916cfa79ef24c4319288f664ad9158966d7bbb0",
|
|
||||||
"af5b9ac426ae79591fde6816bc3f043b5e06d5e442f52112f76249320df22449": "0xf6e490c108d047e8b1e7687d219862981328a63f0b8b662b224013b0543795f6",
|
|
||||||
"2fb245b9a84554a0f15aa123cbb5f64cd263b59e9a87d80148cbffab50c69f30": "0x0541a3b9aa54e4a53cdeb4c59e904ca21b8452c3ee958426ee77dfb7bd8a304d",
|
|
||||||
"6d881ecf489bb24aa10468ca332e3ea262a9bf3a8fb9db1eadac9cce544b16b1": "0x3192e929d4d7c3366ee294f7bb97c73063234cf6999b028a892b591e7f95348e",
|
|
||||||
"15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717": "0x279e7c274c3c7dbfb44f9d01f21a2030df935895a58b0d72da670a021f21f387",
|
|
||||||
"c2289a6a43d2ce91c6f55caec370f4acc38a2ed477f58813334c6d03749ff2a4": "0xd161d5885f69684a41c3f3768eb3dfab5ba81341c9d54d5bcf3b687848b25eec",
|
|
||||||
"3f4b77dd904e849f70e1e812b7811de57202b49bc47c56391275c0f45f2ec481": "0x9c6712ec48c0fcb5777e6931358d5699d10fc5d8dd01a72acaa88b3575102fc7",
|
|
||||||
"6489800bb8974169adfe35937bf6736507097d13c190d760c557108c7e93a81b": "0xd20b89571c8cb09515e254f5f0b834118baf0f9421e058e990395fa1956f2c24",
|
|
||||||
"2dd14c7c38aa7066c7a508aac299ebcde5165b07d5d9f2d94dfbfe41f0bc5f2e": "0x5827dab7a6dbc0163e127d94e5b911af4a23ca6cc9f9f00664675d8458a8ddfe",
|
|
||||||
"05934526b94a9fbe4c4ce0c3792213032f086ee4bf58f2168a7085361af9bdc1": "0xb1271821410c1fe6ee4c73d9532016ee3d28f36ab8f9bcc8a2f8e6953f420072",
|
|
||||||
"1ce9069708fb49e2f1b062fa4f1be0bb151475ca506939d6d8c14386d49f43dc": "0xe6cf726dcda4d6460d720c033c228d73223e2565cd73b53b01984a784438e844",
|
|
||||||
"35f1e0d9248599d276111821c0fd636b43eef18737c3bb61c7c5c47059787a32": "0xe8629a9e2406f70d1f2cb79440c925ca5ab6268ac42f0238abcf9c294f0c487c",
|
|
||||||
"8ac0c70fff57e9aefdf5edf44b51d62c2d433653cbb2cf5cc06bb115af04d221": "0x79616958f2f996b09e67d14b2174c3837cb4aead1eac12c113cbd4755c1b47c4",
|
|
||||||
"f8d030e4ef460b91ad23eabbbb27aec463e3c30ecc8d5c4b71e92f54a36ccdbd": "0x315181450a5b4e27b92d14f0ce92a8d2ee883382fcb0fb933c311d540ecb9a81",
|
|
||||||
"5bc91f13e412c07599167bae86f07543f076a638962b8d6017ec19dab4a82814": "0xba116f057c8c054298fc2b4db35daaad903dfc2126816a2d51cebe4946c5e757",
|
|
||||||
"4456d442a152fd1f972b18459263ef467d3c29fb9d667e30c463b086691fbc79": "0xdba646841ffd000fed92f1c0163698c69f3ccb74396497c98f5e4bef93d57ab2",
|
|
||||||
"385f64d993f7b77d8182ed5003d97c60aa3361f3cecfe711544d2d59165e9bdf": "0xb0526b6a2960ebacda89119c86e446017fa42b9e1b33dc6d7bf57c86cfa6e311",
|
|
||||||
"7507a4629ad0143550666bce2e7cae0b961a0f624f821feaab642fe1be632f5c": "0xc2d2b046ee149862c35d1a2254e0b86e49aa7fdfaa04b01326603ed01914a237",
|
|
||||||
"92eea8ba1b00078cdc2ef6f64f091f262e8c7d0576ee4677572f314ebfafa4c7": "0x4ae42d6bf465609d0fac2c88cbcf07a803db5b1cb6e462de27eca2f73f53266f",
|
|
||||||
"d00bd77d97dc5769de77f96d0e1a79cbf1364e14d0dbf046e221bce2e89710dd": "0x15dc9e730bbaffeb61dc3d981c5174c5dd418b1ad17938ffa075e2e42d52e685",
|
|
||||||
"eef52e09c878ad41f6a81803e3640fe04dceea727de894edd4ea117e2e332e66": "0xe2f86479f8a06477a24e8f327a40ad10762dad6cf183b8b11421bc85ac25bf98",
|
|
||||||
"5b1703d7eb9dc8662a61556a2ca2f9861747c3fc803e01ba5a8ce35cb50a13a1": "0x1ef38c56051de443c1ce78814325574b20cad961124fd93d62594eb318608843",
|
|
||||||
"944f2f908c5166e0732ea5b610599116cd8e1c41f47452697c1e84138b7184d6": "0x02abcd8ee685f964e7a61786d39730ab6930be3af71923573a11d9751b87b50a",
|
|
||||||
"0781209c28fda797616212b7f94d77af3a01f3e94a5d421760aef020cf2bcb51": "0x6d31b621402c45fe3a780117df9b2b9c0b9181e305d25ee96cc2f6c89b1b3def",
|
|
||||||
"c19405e4c8bdcbf2a66c37ae05a27d385c8309e9d648ed20dc6ee717e7d30e17": "0x24fd10e29290a05f9503950f781e8f63ce273adf29580cecdb48e797a5bce342",
|
|
||||||
"bd4dbcbfd90e6bc6c583e07ffcb5cb6d09a0c7b1221805211ace08c837859627": "0xc7fd1cd1f9c6d824626d786bf983b9128e275ec8a9ee7db8331090be89e7346e",
|
|
||||||
"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d": "0x0ea409db743138a6a35d067de468b1f43944f970267a9026de9794a86e3a0ac3",
|
|
||||||
"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43": "0x144ec4135c65af207b97b3d2dfea9972efc7d80cc13a960ae1d808a3307d90ca",
|
|
||||||
"49601625e1a342c1f90c3fe6a03ae0251991a1d76e480d2741524c29037be28a": "0xbe76c55678f43f07c22390dbf3b58666e45529543f7c5524b39c566fe2920c97",
|
|
||||||
"67649450b4ca4bfff97cbaf96d2fd9e40f6db148cb65999140154415e4378e14": "0x7d52011f90533c0f8be0d69fd4c2bcc64917d1956de78f2c0ff08661e9831659",
|
|
||||||
"19d75fde7fee50fe67753fdc825e583594eb2f51ae84e114a5246c4ab23aff4c": "0xbef4367a85f9ffa85411337f7eeb93ee79fd2f2ade37e8c5b84add0d2814b6fe",
|
|
||||||
"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a": "0x1db46472aa29f5a41dd4dc41867fdcbc1594f761e607293c40bdb66d7cd5278f",
|
|
||||||
"389d889017db82bf42141f23b61b8de938a4e2d156e36312175bebf797f493f1": "0x0946dcdffe349a04e1fe3078711b4b5e662bc74a0732c783ece1cf33992ad19f",
|
|
||||||
"23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744": "0x168aa44fa92b27358beb17643834078b1320be6adf1b3bb0c7f018ac3591db1a",
|
|
||||||
"4e53c6ef1f2f9952facdcf64551edb6d2a550985484ccce6a0477cae4c1bca3e": "0xba58fd5f657f67aba9b209187833d917da2984445e1e3b821571adbb11f89765",
|
|
||||||
"765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2": "0x41874d6f43bb98b7111a65ce24a070265927d643734f5dd17db5d180643dbc1f",
|
|
||||||
"58f4ee3a0fc4de834a2e96274a696d0f3d8ec45fc76131a6a49fcd18d3ca9812": "0x73cbfcf7490fb050ec1f29fe107bca2831ff0c7c5f3961e067a1f87013ca23bb",
|
|
||||||
"972776d57490d31c32279c16054e5c01160bd9a2e6af8b58780c82052b053549": "0xd9cd763d08d880137479acfaf219b4c8592c8f288219737c94b853a973fad2d7",
|
|
||||||
"6b1381ce7e874dc5410b197ac8348162c0dd6c0d4c9cd6322672d6c2b1d58293": "0xb67ff2d04061d42600594a7b525463e00bcb6d740581fba5fe919a8fad53aa43",
|
|
||||||
"5967c196ca33171a0b2d140ddc6334b998dd71c2ddd85ba7920c35fd6ed20fe9": "0x98f8556f0c3af32684144ac87a98d1dbfe3490c044404a861f746b3cc4599ca2",
|
|
||||||
"2356af9529a1064d41e32d617e2ce1dca5733afa901daba9e2b68dee5d53ecf9": "0x1645fa789b430edbac3021625db360ae4ef37963d58e104b1149998c2ba1c4db",
|
|
||||||
"735f591e4fed988cd38df74d8fcedecf2fe8d9111664e0fd500db9aa78b316b1": "0x7dc63947c4204ae9b73bd6a4a225f21ac661fe828513950fadd9e7301446ee89",
|
|
||||||
"d69731a2e74ac1ce884fc3890f7ee324b6deb66147055249568869ed700882e4": "0xa583300e45819172cd1e189bf91c3c8b459125c0c76f2ec109a1bc08e479f60a",
|
|
||||||
"12848738d5db3aef52f51d78d98fc8b8b8450ffb19fb3aeeb67d38f8c147ff63": "0x5d0c24e5927d70522f1af63f23bdbe632264fa83ea4f8c7743e71d24d24dd4e3",
|
|
||||||
"d64da7f265f00c456c2ebadf4593848129b9c86b45523e441d2f5ceb838a89cf": "0x0afb0ba9a87527239880aa77d260e8ad84c2c6e2b8393e070e1bdf35f1b84dbb",
|
|
||||||
"baa284eaf23edf975b371ba2818772f93dbae72836bbdea28b07d40f3cf8b485": "0xde213ecfd2d9b72900a63c8059aa52f2f603dfa927c9746b86d0cad871392878",
|
|
||||||
"c572690504b42b57a3f7aed6bd4aae08cbeeebdadcf130646a692fe73ec1e009": "0x481568c83f3976fe559950cec24cdffc88bfca468c47617923fd956eb2e4957f",
|
|
||||||
"78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501": "0x27214b7472029ca3cbc758c158837bd7cbdcd23af81c988e4db3168efb6fd7f7",
|
|
||||||
"236b30dd09a9c00dfeec156c7b1efd646c0f01825a1758e3e4a0679e3bdff179": "0x7280d2f6d66035ba01f9ea3396554390d9b6a5396422d7233826d258a92010cf",
|
|
||||||
"46b8cc9347f04391764a0361e0b17c3ba394b001e7c304f7650f6376e37c321d": "0xd70758a65410dd05844f1f0b71e28e0531c4e4e254478544c025388f43a1b5d7",
|
|
||||||
"5867f5683c757393a0670ef0f701490950fe93fdb006d181c8265a831ac0c5c6": "0x75808d1ab7d796cd470e81e656d33fc956446b72d915406a2823ba060df11a5a",
|
|
||||||
"b216f7ca372b318985903866e0b6dc44a14564828c49f36d0d363805aa76335c": "0xa87a8dc56447a9cc0d6eed383f18de9716af8d00b2d4a61c36e790ca6e58e66a",
|
|
||||||
"956740a4e169e90bb141abfe93652ae3434693bc7ca43cbcea6471408f19ab90": "0x5f578eb69f3dc953ebd8b6b4fb93c3302085a8c38fe062383440f5d3329b369c",
|
|
||||||
"b82449fd728133488d2d41131cffe763f9c1693b73c544d9ef6aaa371060dd25": "0x9ff35aa7e87abecc12c1da52521d48d28e444ff0696454aef7ea31cc6205e95d",
|
|
||||||
"d57d90cd8554ea0cf8268de30d5ad67fed9a8f11cce5132a49eb687aed832ea6": "0xe545620abcfcab122fb0ab90678ac599aebb63ecbaf94798da49869bc66ac6af",
|
|
||||||
"88e2d5cbd2474766abffb2a67a58755a2cc19beb3b309e1ded1e357253aa3623": "0xe3f1b484dca618f06b7962330267d9d4ceee0aa0276fb4dae9d94a7ee2586ca5",
|
|
||||||
"e799f456b358a2534aa1b45141d454ac04b444ed23b1440b778549bb758f2b5c": "0x62289212a6d44ae23d6553c269a7f6d6b9cfbe0d3d8ebb8c8c5c4bd49fd8a41d",
|
|
||||||
"67a6f93030420c1c9e3fe37c1ab6b77966af82f995944a9fefce357a22854a80": "0x0eeaccf721d53ee14bfcc337f00d4f58195f15455d2f9e7fae3ea3e929203994",
|
|
||||||
"9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d": "0x1486f830bcb8f098efd987ff291c0f86240bd0f2a77f379078f04325711de506",
|
|
||||||
"5de33a9112c2b700b8d30b8a3402c103578ccfa2765696471cc672bd5cf6ac52": "0x607890f56b8c3aab0e56f6fd52d4fde892d19462e4f80a51cb5d47191eae84b5",
|
|
||||||
"701223c92a39dbab065c4a7997fef9c41c8de26ca2bf1f808ce0a4ea1cfd421f": "0x0c30c67d1758b9440135fbffe8457f0b47243790300b2e71c52c8e51626cee84",
|
|
||||||
"c719eb7bab9b2bc060167f1d1680eb34a29c490919072513b545b9785b73ee90": "0xb4e5da748598a4bd9e165f7acac70d05c79be86896b95a9c444b4e0840055ba9",
|
|
||||||
"23199c2bcb1303f667e733b9934db9eca5991e765b45f5ed18bc4b231415f2fe": "0xe40aa9805db55e957d7a330192b0b6dccd07da10a0584aa9c29c100906a424fc",
|
|
||||||
"05380f8817eb1316c0b35ac19c3caa92c9aa9ea6be1555986c46dce97fed6afd": "0x6dd1245c596b96e7610ebe0a3b2871a1b9e56416d2ba6ef46c725dd6a9d354d8",
|
|
||||||
"6034b1f68b9363dff2cf9d53b1a88fb4d0929c65f34d532db53738853efc00ad": "0x389321e21c0fbfbc87b6f028c574edbcb3bf3c5add55d70197845f6db7eb8ba8",
|
|
||||||
"b98e7ae8af2d298d2651eb21ab5b8b5738212e13efb43bd0dfbce7a74ba4b5d0": "0xbc7c8ed97abb4cd01a3ae45d00ec6705ae5545b48247a6f7137e7b1f07c03f2c",
|
|
||||||
"10946973bfcc936b423d52ee2c5a538d96427626fe6d1a7dae14b1c401d1e794": "0x91d21d68bbdf8cd3b735ce1589a6d1ec2c014a7b187461e66377856a7709ab0a",
|
|
||||||
"70dddcb074263ce201ea9a1be5b3537e59ed5b9060d309e12d61762cfe59fb7e": "0xb3f046e69beb0efce10e537ad23290031ccef9deda7965d0a0f2cf65f97b71dc",
|
|
||||||
"6f9cd89ef1b7fd39f667101a91ad578b6c6ace4579d5f7f285a4b06aa4504be6": "0xd5d8428261bd671644a8a623557ddf3c87ead971bc6c6778df7887c854bf82aa",
|
|
||||||
"07a8f31e8910c3b52f338d2aca6f4dc2404753ebafcdf53290ef4993911a71f8": "0x94a6126dfa234583c547e826751e43a6d3e2637fce75076c1ba40695efffebf1",
|
|
||||||
"e13b1c1ffb32f34e1be9545583f01ef385fde7f42ee66049d30570dc866b77ca": "0x7f6cdd0117e8f2e5f18403acc278394237f4b118e791b025f8edb3bfa2276d62",
|
|
||||||
"8879170230c9603342f3837cf9a8e76c61791198fb1271bb2552c9af7b33c933": "0x12e316df7a091f9b8c576ebf64f828a3d080a23223d596d522440edd6df36a9a",
|
|
||||||
"c9e9d228f565c226dfb8ed5f5c9c4f57ab32b7ade7226c3239ff20911a9c3a7b": "0xc3f8fd27a445af598790fff749af538206a084c9512e86e10fdf50b2f6833820",
|
|
||||||
"19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5": "0x8cf5ac81bc19d99b5a073c193907b6dd891236a065a907894f96b9aa1a9ccdc7",
|
|
||||||
"45b05d03edb6081e7ae536b94b450a42f43e6342791c560a481030b41f9b945d": "0x87e6124bff3732ad6aa5f2839e314c4d22e121dc4827079908bde78f6c0b37f4",
|
|
||||||
"c8acad81438490d4ebcac23b3e93f31cdbcb893fcba746ea1c66b89684faae2f": "0xd25c3cbd10f68614cad75bd4663c734ae830487f449e44c476fce0e5d733393d",
|
|
||||||
"d3178156b7c0f6ce10d6da7d347952a672467b51708baaf1a57ffe1fb005824a": "0x8b6c3644e786236206264929b841116e59b75863c6a9ee8dbf06cca6454aa5e5",
|
|
||||||
"70ab610e3ed6642875f4a259dc29175452733316fee440f23fed99154d1d84f7": "0x348121e8fb0d35fe0bd970ffd1d0c770e2a6f676f46538091fc5d81235cb06ca",
|
|
||||||
"37505261e557e251290b8c8899453064e8d760ed5c65a779726f2490980da74c": "0x3c85d4072e6f5aa35bb9c359c88aad41c962a53a7128b2586bab130d8a034592",
|
|
||||||
"3b4656b0d92f0e995024c3dacfc28c47d11af83b374a56c26e514e9a7e46a240": "0x26344c550151d60c0beadf5f3c2fda4db12e70b4705eb51a421b49d3468abcc6",
|
|
||||||
"93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7": "0xb2d9ac5eed302e8b5c1b1a39d89f05606cfe220391ffd41203e53ca0b2703f89",
|
|
||||||
"6d0af467543fc7daedf7abed96423877560c8d03725f3e5c87516774982a679c": "0xe273328d614db3aec926df6ee7f641bdc752ad55bd5af55f866cc1886b58bf83",
|
|
||||||
"8376cfd7ca8bcdf372ced05307b24dced1f15b1afafdeff715664598f15a3dd2": "0x0223b5961d18f2931a4612eaeb8f92516acd4a1062dcc4bdc7f540425bf549f6",
|
|
||||||
"ee70804471fe22d029ac2d2b00ea18bbf4fb062958d425e5830fd25bed430345": "0xf49d27eca820e75bf4bbb0b403c87a9c5ad8af728ea7ff36b0f923f8430607f8",
|
|
||||||
"fa17ceaf30d19ba51112fdcc750cc83454776f47fb0112e4af07f15f4bb1ebc0": "0xe903bfc8a57f66d18463b6fde29afa5a0319cb5f80e4a5cd4998611a8506a08f",
|
|
||||||
"0b1e3297e69f162877b577b0d6a47a0d63b2392bc8499e6540da4187a63e28f8": "0xec29451f73f5a09cf05b461d717858f763152111f7031bbb158916bb26462d43",
|
|
||||||
"d45392f678a1287b8412ed2aaa326def204a5c234df7cb5552d756c332283d81": "0xcb26fa836cb0c55a50e8946abe3e25d5f7fa74800fc9f6f8041769307f640884",
|
|
||||||
"67aed5a24fdad045475e7195c98a98aea119c763f272d4523f5bac93a4f33c2b": "0x63e31fbd85d67c722deea6dda5f7dc1764fcaa27cb34e7c0cc89d5e86c9d6e53",
|
|
||||||
"5c2416ad4b5fe25c38ea2078927d59dad6a1d4110480c0c96c9b4421744f7507": "0x3395df92c2c363d85a45c8044e35bb60e9c7afa48caf94e829aa41e93fb60681",
|
|
||||||
"1888f463c27997174f97d2a36af29bf4648b61a5f69e67c45505a80f826bb785": "0xf4f3fb45757e9af82c850974f9531777a378f5a8bccd45b2e83b1bbd2f0b9949",
|
|
||||||
"327ae981719058e6fb44e132fb4adbf1bd5978b43db0661bfdaefd9bea0c82dc": "0x9bde4683d80e5262283355d572b2b2601eb50a84c9b8b9df732c36c14f633765",
|
|
||||||
"3607bf4d7b78666bd3736c7aacaf2fd2bc56caa8667d3224971ebe3c0623292a": "0x769bf65cd7d01c07648a808d6254b3d73a769b7ba1e96dc9b05dcd58f67be08c",
|
|
||||||
"2394ce86c7d68050ce52797923860f6c1656a73fb11bd10dacb3f9c719acdd1d": "0xfeac66a8f3dcaa723609b06cb6f9eaa20bf92c80d74964c74b9c33c98244b328",
|
|
||||||
"2077043ee3b67b9a70949c8396c110f6cf43de8e6d9e6efdcbd557a152cf2c6e": "0x6158dae7ddc9178fe4d4663769f952a6253cb5803f8bca6cd5c24791932da82d",
|
|
||||||
"e1d3115c6e7ac649faca875b3102f1000ab5e06b03f6903e0d699f0f5315ba86": "0xc13e1eb4edfb4b7e5d5687f3baa0b106fbdb1c86c5ad46072b6e09cdbabe279b",
|
|
||||||
"e65ff435be42630439c96396653a342829e877e2aafaeaf1a10d0ee5fd2cf3f2": "0x0ff485223dc1d6b0463ce9ee33287642bd42dc6a2048a7cad7d4bbcadd8d9f51",
|
|
||||||
"432a52bde005a010dc32c47733e4595fea0ea04df3b5aaa1c45153a527d646f0": "0x81ac67ae2314b786980f3465eaba7a7277e0719de13e987b2f1367eadca0328d",
|
|
||||||
"a1a6465f4c2ebf244c31d80bc95c27345a3424e428c2def33eced9e90d3f701b": "0x6cf621863304d486b8c623cca492ca95cfe0d641abd288139a0495d63129f9cc",
|
|
||||||
"c81114e16ec3cbcdf20197ac974aed5a254b941773971260ce09e7caebd6af46": "0xe79a652ca6e6c242a2865bf11d6b1e3ae2464b2740fcb6b627278a4565613a07",
|
|
||||||
"d052e6f54fe29355d6a3c06592fdefe49fae7840df6d8655bf6d6bfb789b56e4": "0xe8399d70a6d0789c961a3fb8bca2a7aa8820ac42c9f3fc9f246d7d5f513fb912",
|
|
||||||
"63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3": "0xb419c2b26f4cec0da24a719c33fb5a503613a5a1f080fb1b29c1d00a2d477f3f",
|
|
||||||
"1021a42d623ab4fe0bf8c47fd21cc10636e39e07f91e9b2478551e137d512aaa": "0xd130d51ee53be539e71733e41899cb9d70dfdc3b53c5934dd200ed9a86767b35",
|
|
||||||
"d37e4513ebe235fff81e453d400debaf9a49a5df2b7faa11b3831d35d7e72cb7": "0xbf45311362a393ab0331658ffeeb51b85fd32629643152199980f1a83a019246",
|
|
||||||
"95609d32c98a467a72ac419f2e64bb2b8dbd5b00b74f3a0fd72f42343af1743d": "0x5a2bf6e3ae4760a934ad5598459dbb398c887839614c0a596935139baaa3869e",
|
|
||||||
"9095653620547ece988ec51486dc7a6eb2efddbce8ea5bedbd53bf00cca84cf6": "0x8bd322a29436b44cb3cfd5268266435a7b81ddd5f46c6f651943ff57c694aae9",
|
|
||||||
"ff4c53361e36a9b837433c87d290c229e1f01aec5ef98d9f3f70953a20a629ce": "0x0190cb92736e9d7d9f4ed17b92f15473607dfeb93b93409504cf19ae6d4250db",
|
|
||||||
"9d23a47f843f5c9284832ae6e76e4aa067dc6072a58f151d39a65a4cc792ef9f": "0x4063d4b34fa78c353fe2ac708d16d95b20ad58cb89781e55665e257d7b2d0425",
|
|
||||||
"9aa471dccea36b90703325225ac76189baf7e0cc286b8843de1de4f31f9caa7d": "0x0a8c3df365d92aa5b947352371c02a555ea300359ffd37fcafcaa3c529cbab7c",
|
|
||||||
"b7e3904c08ddd9c0c10c6d207d390fd19e87eb6aab96304f571ed94caebdefa0": "0x7ced49286dcbc4711535d7bc10a853527854c55cd5973445b1f1c5aa81b6f49e",
|
|
||||||
"70cd05521e3bdeaee2cadc1360f0d95397f03275f273199be35a029114f53a3b": "0x38739a5eed6d192c88ad72cdda0ff1d4420adf4dc7ad78ed254eecece1f55992",
|
|
||||||
"15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864": "0x9a1511ffe5a1eff9d148e7ff6d440eaec96325632e67f041976ff2fd9d1b8fc9",
|
|
||||||
"2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d": "0xa6ab98ad22e85c0b1673c3b7fe55fa454cf1d23fd8c4cf9ac85d97070872315a",
|
|
||||||
"dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c": "0x15da230ea0b9de48c24067720adbe77d511be606659668b9252c72fd4f12896a",
|
|
||||||
"3112b03a41c910ed446852aacf67118cb1bec67b2cd0b9a214c58cc0eaa2ecca": "0xea6c34fc172fe57491e3bc613e13f7a5232704977d0efaa8c38fa3eafb53a190",
|
|
||||||
"8bf649e08e5a86129c57990556c8eec30e296069b524f4639549282bc5c07bb4": "0x757936648c89c45ae5eec993531ee5f725362070eec7394d328fcda4e5501f25",
|
|
||||||
"fa2d39b681f3cef5fa87432a8dbd05113917fffb1b6829a37395c88396522a4e": "0x42dc6d003a90a5e172673236488918908b0704f8da67ed090f96a85f6ddb0376",
|
|
||||||
"8419416ba640c8bbbcf2d464561ed7dd860db1e38e51cec9baf1e34c4be839ae": "0x6678e6bc78d00aafa1135f9ec4813d9070a35bcd945dfdb447e784df2fd7b3e9",
|
|
||||||
"bd640cddb72063e2ede34c6a0baf6699759b9837fcb06aa0e2fbcecb9b65fde7": "0xaec019399f0c843477d0fb85ff549595cf86a1181739a381add99d4dba298664",
|
|
||||||
"06d9fa501fd2bef47265361ca0eaf6e0a97c3b226cea5ab760240f70818581ad": "0x1d73b0ea969a4a5e3016f18b98fe477dc8c1aea8c3d1bd6353d7bdeb40f0b11b",
|
|
||||||
"b00b60f88b03a6a625a8d1c048c3f66653edf217439983d037e7222c4e612819": "0x822ecc552fc661aeb063317c23d19d702eae783ca3a7348efee141af5f777a05",
|
|
||||||
"83a6de4ec10bce1c0515d1aac082fd193f268f0c3b62da0c8ed1286319272415": "0xacc9bb2c3d151d04d6c8ef6d793a5a22ddce6a4e030dbccf8eb4df79ee853356",
|
|
||||||
"fd05a384ba19863cbdfc6575bed584f041ef50554bab3ab482eabe4ea58d9f81": "0x82744f353e7b2987fc9b922a34c1ce5233ce47fb73c2805b329f4bdb47f2ca4f",
|
|
||||||
"feff234600320f4d6bb5a01d02570a9725c1e424977f2b823f7231e6857bdae8": "0xe077710b5ca75178aeaa20a3190b61c7f366197222fa0b999bbda58ee92d88c4",
|
|
||||||
"3d253019d38099c0fe918291bd08c9b887f4306a44d7d472c8031529141f275a": "0x3af9e87e527860d7554cc3f3d2f068c341d554d1c321280d608deaf10e620a05",
|
|
||||||
"26d53c97247ec18d576bbd23f88078acc22b42168dcb1d29a76501a956e26bad": "0xa43c7f01106bc158770caa061354c96dc01f01a8549f6167988c9315b22fa0c4",
|
|
||||||
"9f383d612ac09c7e6ffda24deca1502fce72e0ba58ff473fea411d9727401cc1": "0xb21f8c8b67a213288b06d9f7b8d637dee468e0819a87b4109d42abe97bb0d7c4",
|
|
||||||
"ca3eed9b267293f6595901c734c7525ce8ef49adafe8284606ceb307afa2ca5b": "0xc4b6e8fed5fdf6732aea2dbb99689eafada1beb6b8e6ad721483f7da1d9bed3c",
|
|
||||||
"2f7c4f738d498585065a4b87b637069ec99474597da7f0ca349ba8ac3ba9cac5": "0x03e5eab4e05ecfa1586864e99d0cf7ca041d538f3d060746186ca3e570918014",
|
|
||||||
"26852e2d0696e25e6adaad2d7ca3a1f2f15aab68d317ace14d41b4128a7e780f": "0xa3431a3f6a43dad744494ab9c05e848875044aa280bd6116ac60d9a5ac58ca75",
|
|
||||||
"703e36203020ae6761e6298975764e266fb869210db9b35dd4e4225fa68217d0": "0xb0a059f4bc5b92f2e9a8ad97d406d1d14455a7cc9dac58fff9fb475ce3e675df",
|
|
||||||
"6b701e292e0836d18a5904a08fe94534f9ab5c3d4ff37dc02c74dd0f4901944d": "0xc396eb2b9c1914c6dbfa66b7188ab5ba36688787e1ae8bf96a2c4ade9732cbb5",
|
|
||||||
"eff690a187797aa225723345d4612abec0bf0cec1ae62347c0e7b1905d730879": "0x82bf47e2ac2597bba0f0c1775ff81cdff2bfe1d9af2a65712013cc2d614c6f94",
|
|
||||||
"6c75e52531ec5fd3ef253f6062956a8508a2f03fa0a209fb7fbc51efd9d35f88": "0x30886170ff4d71398a5818940b0c2abd54b13c536c9558ed197c2f44ba2cbc35",
|
|
||||||
"831624f51c7bd4499fe5e0f16dfa2fd22584ae4bdc496bbbbe9ba831b2d9bce9": "0xd1213505a03e0c4ddc08bfc3875b03c472856f5e481b4fbcd1a18ba59d3cac07",
|
|
||||||
"3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5": "0x3f5facfd23427362a17d5e0dca85c94098fb49bded49a2555058a352bb516a56",
|
|
||||||
"5c6c0d2386e3352356c3ab84434fafb5ea067ac2678a38a338c4a69ddc4bdb0c": "0x3ece052ac5c282aab98a3c43ff7d02147a8b506c3f22711f99654537aea47131",
|
|
||||||
"6e3f3fa8253588df9326580180233eb791e03b443a3ba7a1d892e73874e19a54": "0xa17792daa3e88d2825ceb249ec92c455d5f01d8fc8109779a6c79bb83846370c"
|
|
||||||
}
|
|
|
@ -1,211 +0,0 @@
|
||||||
{
|
|
||||||
"5a035d5440f5c163069af66062bac6c79377bf88396fa27e6067bfca8096d280": "0x848d1c941e117f515757b77aa562eee8bb179eee6f37ec6dad97ae0279ff4bd4",
|
|
||||||
"a7e2e2f7d47b17d18e6d49c427f21fb30c0a85e621a8502c3c4e486f3ab543c8": "0x686bb2f0e5e0f77d95643dc43602e946b1ebb23eb1fa2fe53aa64a8fa752fd14",
|
|
||||||
"651071f8c7ab2321b6bdd3bc79b94a50841a92a6e065f9e3b8b9926a8fb5a5d1": "0x47f6bde244f03f745cacf56266bf40866d2fa0fbc173dc557895463164a40fd3",
|
|
||||||
"4e10201a9ad79892f1b4e9a468908f061f330272c7987ddc6506a254f77becd7": "0xe9c126fb0111a5115c7671515b6212bea36620975af61c9327498e55eca3be20",
|
|
||||||
"51669cd280ce96d95fd703dc0b9eb5ce0e13b53054114a45534d27563b0e662d": "0xf6706de982c14c6605f0da679114ff55faae5bcd4396a08d6e8898f7c7e81ca4",
|
|
||||||
"83be4ed61dd8a3518d198098ce37240c494710a7b9d85e35d9fceac21df08994": "0x9950e6bdf1d970ca30991cb88ea50c9de35ed12bd12ec88343f473d72cffd6ce",
|
|
||||||
"d77bfe9814f5a4718e1420881093efa8c0fe1a783472899f27ad4c7a58ef4d27": "0xae6e7be1c01ffb50fd12cb5cb339703ef4eea4b8e3667efa77e9fe22f1f898e0",
|
|
||||||
"72fe21b4ba5661f194b5f17bfadcc59eddd3e0e53198d040e5091c6dfb558108": "0x9e85ef1163ac217fd9bd63aa0aed0ce3607a0c21937ed4d28db1cbf3af34215c",
|
|
||||||
"796d24444ff50728b58e94b1f53dc3a406b2f1ba9d0d0b91d4406c37491a6feb": "0x609033fd00b92341826ac014a7985691b82d1c45e2a1d336a25070b2c12b43de",
|
|
||||||
"7a92fdd1bf0b2d76ac1fea88c9eb7bfb1907d25d12e0ec47feb2a8e28e6892d7": "0xad202d37a3afb72a822eab20a0737d7de7ddc9956cdb35eb06065442a965210d",
|
|
||||||
"0e47ed5970339fa822759bc97c2b697a1a45727888dfae9858971bbd3327e5c8": "0xb459e26c62091ab151f40c00bb21fa0fe76e493690ec60244c72aed91791dc34",
|
|
||||||
"fe650f0367d4a7ef9815a593ea15d36593f0643aaaf0149bb04be67ab851decd": "0x749f40cd80e5e43702fe11d08274b2ecfda77258049fe946fe17858bf4882129",
|
|
||||||
"6cd5c99c6d86df928b0562f26617ddef400818f8907391f3087965e6b786b0b3": "0xf30ad29fba7a05e86f54d826daa4a563c7b349399411974ec1d27da7f8b547f9",
|
|
||||||
"bcbdc2755bd74a2065f9d3283c2b8acbd898e473bdb90a6764b3dbd467c56ecd": "0x547afbf2a36d54cf8945f1d4db1e733cb0c6ee2987d77397d1084deb96567316",
|
|
||||||
"f3030274adc132e3a31d43dd7f56ac82ae9d673aa0c15a0ce15455a9d00434e6": "0x7346dc4ee628c491f00ecd21884e0aee29962a9db43efa07080ebdc92b0c60a2",
|
|
||||||
"4193915dc8d03bc15603ec3c0ca9c5e3eff6726c2a2cf262e30be121c2b9a206": "0xda6b4f0d9db50ff2b550a2465aee134b1567b0ffb8d4566431844c22c6d382ab",
|
|
||||||
"bfaf7739cb6fe3e1c57a0ac08e1d931e9e6062d476fa57804e165ab572b5b621": "0x38544928bdd6e4ccb5bf42b73ed483bba84d4baf99c596c13a9be88d26072e36",
|
|
||||||
"a46737d6e4686b9cddd59725c9564f851aae93efa37c52f46d9fbcbe03d0344d": "0x8f5baf1b9f69bc94e096cd3064c06d93b5ae94c03a5edce8d683d4caec72622b",
|
|
||||||
"2fbbfed77003411f75ccb824c8996854984565867bfc8263a36f2f86795ecded": "0x0b819c7687a09ad9cf4e0bde19ed1ab92743a60f8d2396da8121cc22e4d0fa54",
|
|
||||||
"2646ca1e1186fd2bb48b2ab3effa841d233b7e904b2caebb19c8030784a89c97": "0x3bcff337f5b4c393c3f38cde34d5841f55b1897279e3a8a4d4e4f57c704a1b02",
|
|
||||||
"312106929adaffd2e1a1098603ffd30ecd6c6fe7861faae6bc81b0e30f4adfe8": "0x55950ce26ba1571f8123d45730b7eacb3f241d7808bc30215ff1e4c4267e2ac4",
|
|
||||||
"b3b2fb5e7825bfe3474d0f378c695f6cb85e229deea14e7a28d37a9e5a1b7749": "0x2cd490062e1558f3ed07a961357f01d22b06c20bd4486b6f712681f78563983c",
|
|
||||||
"b762d257b4bbce7935a8251b3e060977cfab1ed21770e8b431beff4cb7f41137": "0xf2ca880be376a84fa4f42eb76c494fbce87711ddf25b7ab7098eedfa045b34e3",
|
|
||||||
"c7bdaa960b886927325f02f0e4d5db19c179d066f762906f803096c336a4462a": "0x8bfdcc16ece1e35ebe5f343cd491dd19cf390469453ca3a509038495f7dc36f2",
|
|
||||||
"30029479598797290e3638a1712c29bde2367d0eca794f778b25b5a472f192de": "0x38f6c6e0af3f74af4b48e98a7e7686bcaff5d3910830059a0be04367aea79385",
|
|
||||||
"9f2acb902ee5c3a8e41c643164a498ed3089c99df3477189babd368280134075": "0x94b17bd91c471168d62fa4dea7401fac9d59a100542a603d7ba38b0864f8006a",
|
|
||||||
"eea89835d12d9b6286f2251c839c455ec31b6537c60b1f6c559b8478f4bfe107": "0x7225fd19294ba2fef36b37dea84324ee09cffd2c5ff1b066bdb32c8c8a2e16a4",
|
|
||||||
"057aef33dd5ca9b91bef92c6aee08bca76565934008ed3c8d55e382ed17fb883": "0x1fe44b0e63b1111ae00712dbdffa0d407cf86d21cefe27b3168ad330b3a78df7",
|
|
||||||
"732854c8a2a37168037263fa01e47526a5cffe026a43168d61baf4bf4e490f97": "0xa9095446340fba5be680049fde3dc736912067da77d1d97e17e55a6d201636a3",
|
|
||||||
"f73112d4ad26fd37cf18ca9b3f7e6f1a562b5965cbc26e4488a540552f18072e": "0x2918d30386a88cbb8b83e55f00e24455755acba3dd529b84abf0e6baee6a0fc4",
|
|
||||||
"577b331acfc8f86c171ad5ac6b2e580b10df39af0131ce6808628e44e3b77a66": "0x9d53d0a5153edfcecab97d6689862a5f55eb18210e2260d439ac6b0edd8a7dcc",
|
|
||||||
"077e345652cb98edba89815a63a0ede724eba12d7a10c8498e0e762d581aca6b": "0x03a5da40a4799e67ef3ceacd6228a77ed024c1dcabc9d1f1b7f68c17d374d076",
|
|
||||||
"40f63777ba678d5c2c7c69c4ad9daeb867d274bc785c5ada2c84b8613eeb5e14": "0x6bec9afd2a6364cb6e70f0722793959b24ba27032c836cae15a5ea0459a0c42e",
|
|
||||||
"8cbdbeb28d932e84de738a2042de7e2c87f5b0b1ef4e7e346c3df93a202dd425": "0x52f2c3de55496c65450dcb72ee807ea1b82558172317107f46554ec57da77dca",
|
|
||||||
"5b026317d56ec664f2d18ae4a7526f19c29134916f1d2c3af656e63c72e8a748": "0x5567336a7ace56693df655fcc1ef8e2426c46a2fda6ee1678f21ec6122c86abb",
|
|
||||||
"8fece987ff24a0a7ec4d87c29d337e7b54989663536b73883ae8387589cfea2d": "0x46256583d2d42aa31a94a2261fcd28fd519c6c14b5bb2651f20be11c053ce655",
|
|
||||||
"16e38262485de554be6a09b0c1d4d86eb2151a7af265f867d769dee359cec32e": "0x991bae63b6b4e413c993dda1360d8a3f0cf1e60a601278bfffb704af14ae8d5a",
|
|
||||||
"fc309467defa4b198c6b5bd59c08db4b9dfb27ddbcc32f31560f217b4ff8fc2b": "0x124529a72e10fde07279d321d9a4e5157f70d0d125b3c434234413d74ad63f67",
|
|
||||||
"be2c316abe4133b60602db548a0cc9045c533bedc7759df98cf3a9274c5c6f93": "0x0f6f5e07c3393de2a1949416339131b1cd504f103946946d374292c487466645",
|
|
||||||
"aa3761fac23cd01faf71a5865f50748ab58afe045041dd95051b004652c726e7": "0x41c9b0d207a6bdcb7b70f2d1dd15b30797c74974d8e0909e6ac473cb72270019",
|
|
||||||
"178ec659c2e795d91f812a1802a84b456ccbab205ba54b3c5a07f81bf7e74157": "0xab6765a9339183db0e504b817407e9877c2eac364620c32dab9dad732578b912",
|
|
||||||
"9f2f5ece4fc51f0378a5efac659680808f1273fac4e6bce8c8f92244602c64e3": "0x55edc419e2680386951637848c36a201e59c93ff1ce3c034c2284535be603881",
|
|
||||||
"68bd4b3c889eb5ff8c56eed05781f68f3a931d6a1ee5a744d041d70b87e2900c": "0x7db3a6546e7f98cbd40df8b03e258c99df9a27f39f64491ce23bb90269212a99",
|
|
||||||
"80e17c0e489956493ed84e4af202031c38cb7d310c5f154134cd0ff39ac6101b": "0x0ff30b24cf9d61e2f69be85d8de7682fd453f470661046f8bd1a4cb3b25c8afe",
|
|
||||||
"4711f16309de5a18f54e2e5cd074dc7fb000cb41e6a5a333e56ad2b3d8a12530": "0x2ae3e8f933fc352161e65388f80f73643365ee1f29cd579081b86e80736f368c",
|
|
||||||
"2f317bea04ce89adb8acc85a1a68d20d6e89976d5e86306570a0bb3107e4916a": "0xe7b38e0e4467a6294b22f3014c21b660cf7039f8a256c7e8503b751b4b5a4d19",
|
|
||||||
"6ff709bf1f0fdb46d991ae6839163df1e050d143429d737fc650b6b214347808": "0x04b4de59c163aac8e0f262f7395ee85d127aa252db4ed5948ec53266bd38099e",
|
|
||||||
"47b6e6587b839fad98486dd87dbad5a0558377dec53b55f6864501b6187464dd": "0x60f632df232123c78e2ff6511bd0e8b0cfecfbb61c80ff1a8de112896c60beba",
|
|
||||||
"7f57ca775216655022daa88e41c380529211cde01a1517735dbcf30e4a02bdaa": "0xe8ad5b81c782170e7af1a499859a5d0811875f24666e75e9f66b94cae6fbe47b",
|
|
||||||
"b5b88d45d3053431b7c49031e7a4c3de19bf2159dc7502e69d582ffe183d6073": "0xffc86b3a2d53ebd47b21e1180d2d4a212b556990d7ac82567e274096e8d0385c",
|
|
||||||
"e956a4199936e913b402474cb29576066f15108121d434606a19b34036e6d5cc": "0xb5bb6b8a9c1b1235765784110e02b98f17ccf3c808c95f817fdcd0401311fd87",
|
|
||||||
"93ab444e1de19f0ca3e27d2bfcc9b58da4777e927e958bda0ed5632306345c8f": "0x10a414f5bfd7009a5c48e26e30e769de007ce03ed24f39ca191eafcbe30c86ae",
|
|
||||||
"eca4f9c5ce7cbef8a349fa9f6c12b23ac45b9ad91c4d1808c6a2dda841f95a02": "0x5c7405ea81ca6fe5b92ae76b94183063065cb6b1ea4c85a3d184b49aad9388da",
|
|
||||||
"f53898175dc626f78e6ac049f47bad2afb516cf102ebb3edfa04e2d1c6147618": "0x85b3362af1cebfddac393c7a69b8acfba95e0a22f47e8b1e6be6725c168091e9",
|
|
||||||
"677dbbf4f68b5cb996a40dfae338b87d5efb2e12a9b2686d1ca16d69b3d7f204": "0x5c2746b8ded32de46a90963440a12d45cfa51217ca88f5291ac8c1066fe6ddc8",
|
|
||||||
"9ff9aca7ac05dd6725aa169e643c82a34d9061eaead7bb759192cf784bcb20af": "0x953e5cff72d8764b0433b7e20348f30d380a9402fe2be70963a6cd208d9d803c",
|
|
||||||
"ecf553770d9b10965f8fb64771e93f5690a182edc32be4a3236e0caaa6e0581a": "0xa55a4d497e7290ffba5e6fdd73410a4cd0b05ae0810b02cec802ca8c729bffcb",
|
|
||||||
"19786f31e85d3598cecdab810b2787de0fc22c2cf98b4f16fb1e5bf567a0a431": "0x24a177abeb756d6b8b2c62e6f3ddf723728d714578819fa3c9f315f061a4b8d4",
|
|
||||||
"fd4712eb77ed09b64d09b63cd86f8343af561730ce089d6cc5dd5320f2098be9": "0xb902f5f9acb916e78c87c749f054477a4490fa021dc7cdb6014cc46697a331a8",
|
|
||||||
"d999afda91920097eed20eac02e68b9dfa0b8c798d5c7cd24f74a694c2126165": "0xafe5a4d5263adbadb1f016bc6a8103b77393857b717d36c1d3b9ed338941952d",
|
|
||||||
"08f781a893bc9340140c5f89c8a96f438bcfae4d1474cc0f688e3a52892c7318": "0x1af96477c327c47816e89adf34ef4e7d0037164e40c0823267335326817933cb",
|
|
||||||
"4f7d1135da944054f61277c0dbc056572f84226619c0fb3ed741262eec90a57b": "0xfddd9baf8f4d95c185ff8cb668d84d202b4e029e4bf1f2751030e0ccc6e64782",
|
|
||||||
"d952c751e36d6113f62ec2bb1679be4ac69d684b33224fa305644010f7c44aa4": "0x8d95043162723b7538de83525cf391922021c57ff42c88870c0ccbbb50a23ea1",
|
|
||||||
"e07f9830dd639b76fd3c341f323d0a04562f442ee5bab1efe69a265d5ab9b94a": "0x13a40ee42a98abbddc6f6699e5aa8e31a43a1b5c236e70a97e1522139b2ee8a5",
|
|
||||||
"27e2caf78dffd46696e9d7bc6583d1a1add9a3ed4d5aaa9b90fddf049ca492ba": "0x1896990b5b9efca96b16796d1ae022552ecda7d81b3715b966e632c37530bc04",
|
|
||||||
"0d10b9ccdc9af1d65cd4bafabf4e34db01c0ce83abba190230eaf26d7592cd21": "0x93b6294a7894ad36743ec7ec573a54b676f0cba4b3767669d8e9574e3b3a13ff",
|
|
||||||
"587a8fcb91ffb1e7325ca5ea83633271467a7d277a442ff3cb38e981b1eacb41": "0x7f3d62a64d3fb3be665c97a61cfef06839c80ce184c2e7df3d6d53c5f2c2928d",
|
|
||||||
"1a957a00d2c9efce38515c6c939f35ce0ee46ae0a0522be1569d4df06beb1ced": "0x3d1e392d316f1a057210a0e7728e994d03b4967eee2bc585b313a1ae876f9e0a",
|
|
||||||
"c2dec53d44e1fcc69b96f72c2d0a73080c328a0c6ac74bac9f575e7afbf6884b": "0xa9b0bd4355f603ce098497c9acf81e19aa0fcbfef3a2bad531bf78e8925d3739",
|
|
||||||
"85dafbfa99c733fdd33649551666958ca8f82fd0d849746e093b770caab249d2": "0x8e41502848923805f569675b465fdd8bf74c46301e0513ff3b3853a792d14464",
|
|
||||||
"fc564609e09195df943fdcff899ae7448d5abe93e4906db809a8ceb17ece7967": "0xc4461826566cfa7140a622c7173740dc383b622b97c489fe3532506cfa752900",
|
|
||||||
"5212f4bb90c861ed88a2024a435463ab41cacf6f5deeed7b085dca90b1f5cfa5": "0xdc7427f545e1f3fbe6b37a4826b7df2a04deb89adb5b2fbfca5352c8a7c5d43a",
|
|
||||||
"6cdc09f443fe8ed53517b9760b0674d054e719de9b83cba1bbb02c2439448590": "0x1cfb9bb7445120427ad1c8c9fd9ea77132cc16ae8aceec311ab9ca7f58afd29f",
|
|
||||||
"a457fb802064a5a7c5c87c8375165f3e607730deaa9d2627ba7710b4b2841064": "0x60c8c70878104a20cc299b7a6c4d82cee47ea6d64a3d2d30e0b8ee7d2274f7a6",
|
|
||||||
"4dcb3accbf0a5f0d33a0a38968ce520d6009f28b8da573ccab99165fb8d8727f": "0x24376eb82d71129b335d154b6592453088cdd0d56da7a8d1e5ca7315f7938f98",
|
|
||||||
"c1b12769f6633798d45adfd62bfc70114839232e2949b01fb3d3f927d2606154": "0xfcbab9ceeddd466365de05285296f38f68a5f51a9234b2a5508d47b848eddb64",
|
|
||||||
"046f22737835f58f2251df9283339618e4f9510bbe3171582fe50df3fedf8063": "0x361a2d3ae9764df32a1f8c5990de72007750c19e563e5e38fb0f54bb834952ec",
|
|
||||||
"9b245faf19d2f3306b58821ef60b194d7b67eb5250635059d8eaae4a36337b28": "0xbe0418cb36629ec6d0ee7f4443c005807c24137fb5e8318493a11b3a7eb53f4f",
|
|
||||||
"22d0b475cfe70ef0ff58d08efc3d72a78c7949d2c9f00dd1c8f8074e5bbf99e7": "0x291667122891e15cb219376dac799a0792cf934537f17da166c1cde7731e9cb7",
|
|
||||||
"7730809b4a4656325b7fbc8157fd803c3da170727c541afc4db37773246258b1": "0x12a124fefa4c2e92284e6f83b9beb63500a934c30545a30eadcb987edf08c723",
|
|
||||||
"96f29ee40cd494a9f1f154ebd8300e93568b18a01a19a6c3890895718a57e984": "0xbc403288808079f4c26e967be58501ff1b71363f7b5fd4fb124dd3df22190be2",
|
|
||||||
"ac541125cba1f87cd7048ed465faaca653784605e05fc1ee90b979f0a4eb57a2": "0xb465f0c8487feff185fd9f078df1bee6a92ae7c2b70d7b0d9f95126b58dde561",
|
|
||||||
"b17c4f7a56fdda9cbcb73b7edfc6a75f32dfa4f04ae79839b6fdfb56f6a1e9f6": "0x335c299a9db595d1ccb0d1a71b61220e2ef1b80822034d0d8794ebe55a16f0e3",
|
|
||||||
"0adbf6463e27f60f171bcc498703a4282d1954ec3a85e1f6698b48ecde18c00e": "0xc6f2c77f0b96c23eeb68cfeff33372c4c7f29011801358458d268688e54239ab",
|
|
||||||
"7ca28037f63a175cfca36a878be6b5d47d87b2dd677efb8e22f70865d9ff3a6d": "0x2245792d6d6d00cafd4d1487f6d5edbf4f3c7e6c88b3a93eed57bbb44fd200f1",
|
|
||||||
"64ae1fc7ceacf2cd59bee541382ff3770d847e63c40eb6cf2413e7de5e93078a": "0x0dc1fb2aabb09c83a0aea80dc08ed45a4f0232da032bcfb36422d521e1ce467c",
|
|
||||||
"754a0a0800247d77751e35efb91638c828046103be3bb3d26989e65bf4010859": "0x650a8c26d5e4e291b0ff980d7901506dab81ae8b980e1bb2ac5897a1d3d24e2d",
|
|
||||||
"112fb72d9e1d17e491da188324c2e0707a192bf2e2b0a26632de541d45b701ef": "0xcb890d9a07f3d036a93e5211f05b4d72d4038c90949afb85d97e4c8ac12b827b",
|
|
||||||
"f22b3440dc6ff5cc08ef498d434f7e72563bd49d013a8ae8c26199d871ded7fc": "0x670c26d3ef22bd026bcb0d23e4e2c63c51b0b80b1fbfed3ef601560cb9fb805c",
|
|
||||||
"b7abd25a76ddaffdf847224f03198ccb92723f90b2429cf33f0eecb96e352a86": "0x1fcf7d1eb6986350af01dc0b6ef0184e9d18eca1cb0458fb71fd02d552cecd96",
|
|
||||||
"ba1a0a0c4bcfc4715e3bcd5e452346a4cfa6234a3decf51f123aeccf89bbf9c2": "0x035ee37314d2a1b60a603c72e7903b6b2d80fa1bcb048eeef259e93222450088",
|
|
||||||
"4204a764d9e0ca8db0fd43b62728265bf82671ce8a8b4bfedba13672be12de62": "0x62ff59bf048817e2b47ec5cd8bba923a33dea2befce57427023c15b1a6be3560",
|
|
||||||
"abb1a3382ab1c96282e4ee8c847acc0efdb35f0564924b35f3246e8f401b2a3d": "0x727b17dbbe081260a6d76ea613461ba2d03c7d076cfc5a5e3693fd3a9f5c9ec4",
|
|
||||||
"c4d994230a6db7909135e4673287fb672f45ea92fb40b1bc9adf101ecf877ab7": "0x2fd49c275f09f39165e8b217b6661be304c5a269e38cc7a5759ce4e1bb2dd4be",
|
|
||||||
"c323b9b3e6dd09a9d93090322689f0fb44bbd929e8702028ff1ddd838b14d421": "0xb23aab4665baf68374b2ff33235e2b2a40f713438d7ebe01e147f12aabb05fd5",
|
|
||||||
"eba2144f04b3af59382d92b8cbc3170008b4a2945a01f36e81f92dfdeb8cc519": "0x06e9749102fe2664c9bf078977784f6db167de7683fd7dccf9e2ae795eb72c52",
|
|
||||||
"4b57c2471f6ab9250d26b7e0ff8807bfd620a609503f52b0b67645f69eb2d5c5": "0xc2bd639883f4ee04d020908a4e8479470d66bd4fee7e50ac88dfc8c3e3a7ac1c",
|
|
||||||
"69b9ca2e7159fe570844c22bac849c490e0ddfd0349626c19fd7d65509e192a3": "0x44a87d9832bfb6734500f3c54021820ae21d3f0b2c9e975f03e6fe427dbfd3bb",
|
|
||||||
"5b1cb5526da9f8794ffa90cf22b6f71848ba3d76497533d6c37d2be3a0501adc": "0xb0fb86dba700dde7357dfcfac5bfcab7912a5cee66c190d0862704fa28929637",
|
|
||||||
"c8dc7dbfae6aa1a1f0feccefb1fb82fc38ba18d1d0d62380272d53a879c1df87": "0x66d018a6c090a7568c4b7aa571732130266bb2ff98c4b6139129eb9ee7d88df6",
|
|
||||||
"9c3abe6aa5e68f3125776b5367ff5eb6e3dfe2cbcb698c2c12abd949594c5147": "0xca269baef3fb3f9febeec0fe6a305392b5d5ff93a4119d4632269c4d686ea3d0",
|
|
||||||
"475a251c7cbded7645a146fc049d44058aa977e6850f20f4c86e289fb8dbe4f8": "0x3bee5388e7570bc5ecdec4b3422ab9ad841e6f654522294a8c1d906ce1919c57",
|
|
||||||
"74c3dcab79a257c5634b1bd0f57938d308de511ba7fffc2f01ab001084a15106": "0x2e0fddd96daed6a139dc129703813e525464a7315c1d175b18bd3317c0fda66e",
|
|
||||||
"0e9ec6a3f2fba0a3df73db71c84d736b8fc1970577639c9456a2fee0c8f66d93": "0x3df695a5a56aba7989362a058c94748dd48934f02eca2c920090fcdd1d12e097",
|
|
||||||
"41f3625971ca2ed2263e78573fe5ce23e13d2558ed3f2e47ab0f84fb9e7ae722": "0xcc11d6feda69053fed2cb14f4b0f8d0b5a10e5d2de259dda1266b275a1dc97ba",
|
|
||||||
"570b0d8b1874762f45775332a23e7c153c0db9cd77e574ae5f698453a26ca593": "0x5b2b9a5816e3ff913ef6b334bf964131b2f43e0039d61cbab0b32c13a671b399",
|
|
||||||
"67f0ce7248a5e8ec8e83020a9e8b5a6e34259efbb459fc1ba57cd7b6929329db": "0xb55377d513a0a03ff4cb8bfe36cc3e6c9021f7c29b9dd1c1243bf69ff17aa805",
|
|
||||||
"3f545e3f4ec9fd8eb3b9d9d6071a1da361f6729fa1b93d1d1baca3379551d99e": "0x451750493d8cb0dea3d4fcbd6988d39e37cce028ccc17bea35cf07d9074e72cb",
|
|
||||||
"24264e92a7b9a1477c8c69ec6610a330e1720ade0d345175c55781443b8d1b32": "0xf683c8f4c208ddc71135cb5ae2a504f8b9c6676cf25af1384148ec9066cd5d86",
|
|
||||||
"013317758a5b499650d72edcd7ba12bb5cc54ce9434196b607fa5e01e0f7797b": "0x5e78db4274a4646829d6407237449ff553f9d3e0c64c0683e831d56cc633a1bc",
|
|
||||||
"bc00d79f11e851e9763b0951338474dd423f40f51ef6a24d2b0806f341382b0c": "0x9b9fb78a6865d53f0a89e538505c45cc5b89434b6e6adc13f3078a689293b224",
|
|
||||||
"5dedb77c359e5d17c053e36e8f8d89b25613c59e285a247f32dc60dc093f2d9b": "0x85f46a74be653b8417efe8ff84f6c19015cd2e9f6106b584c4eb9441b567873a",
|
|
||||||
"c178e5b0e2dc1e4d5f7893d58e1cb619e58457d616fb21b6c5c994e9d19cbf6f": "0x0e70f5ae0b71498b72938ebe17d6853e02ea00aad4ddeb4034297ed954b0369e",
|
|
||||||
"60fd61b2d90eba47f281505a88869b66133d9dc58f203b019f5aa47f1b39343e": "0xae4ef209edf7f824bbc8f8dbaefdae5e0026a4f18b094dc1e63e3a2e5c7e82fe",
|
|
||||||
"d596b62970582b2eba14b4ef4ab67a0d074007ede767da4e2d8cb9361192d6c5": "0x00b0122bd8f4f5e7991ba9163f01fd8fda77712951223633a49598231fa72a22",
|
|
||||||
"6de025a4cf28124f8ea6cb8085f860096dbc36d9c40002e221fc449337e065b2": "0x3de5601c7ac836896d4098ef1b4103655c02c19bc0d981e753522e38c9acd388",
|
|
||||||
"01a33b54c2911e1f58fdc02bc03e3778508bb9a84571afca33e2757791eb1269": "0x489ccb4344b3439c9ffd86f889be728ae7db78a36e40a4a141cdc658374b80d4",
|
|
||||||
"0d66aae904c7d457ed92c5d933e7d25ecb2b1e285b1be6a4e8520e38bc296161": "0x44d1fb6d8c9f8aa3ea2fe2db20238954a5730cf56c927c6aac9a317aa4e9ad67",
|
|
||||||
"44b948f5d3f5ad7e24e1aacca13872c1bd5ebcc106a44cc70a0f4c6aec2c564a": "0xf78b4b062df31593cf741f069a4196f049110518ffa975a634d9f44861620701",
|
|
||||||
"6a2f031ec9d59f03c1149c9ef75ac9ae419a394e40e318aa6b913b86b47a2f21": "0xb41e2e902bd5e6256ac49d4a48bd59335deba62e73668a67bb7a9f246324dd53",
|
|
||||||
"881768fdbacd7a32ddaf4e67b20cb391380a88f795d8a373127c6cc66997f0c7": "0xd0d5d36fed84a36b2397a9d795b45824cc143dab7403f90d36f3782fc4909af1",
|
|
||||||
"db64d42241ffd0c16169e759ddce05cd4d15607197ebc0f5b8402ab813c7439d": "0x63bc0a019feb6853456471aa104f00865e98005333caf6e111b2a21f4f71275e",
|
|
||||||
"974124ccd9de65f614142b71ed717c2a6b079ae8f69e795e4d4a0d01b7218538": "0x17b78ea25626fb18cd056032aa8a728ab445b0a0bb521ea7caf23006dc20072e",
|
|
||||||
"13ac8c71e4e1c61dece57bea76163d393bf75cd0db8e52981e1564fa592698cb": "0x7f15325769d056e5b6ea050b485b9c8011be20ec55dfa4c9313d68696675ed5c",
|
|
||||||
"eb00e1f858549e12034ff880b7592456a71b4237aaf4aeb16e63cd9b68ba4d7e": "0x5b19be5ba572eb7e459cfc74c9095e873fc923225e785b9aff4ed58becb8aef8",
|
|
||||||
"215660dcce039eac1422c9b90de9feac12b81e7501ebb6a908d70a752f47c868": "0xdd81b90bb513381a876f77b68e342074ddb0ab4414f5fcd2943130d2db5e5f62",
|
|
||||||
"6058b804017a18cfcd598b290519a03331fd0b28aa1f1595f3b9dae7ee6a418f": "0x2d72af221448426e4618e9fb46e0593dc3ae757dc7b68527b692af82729bd76f",
|
|
||||||
"54f2d4037e28936b53732671ecdc73678257fb55674d82b3a4a15b70bf0a68dc": "0x67dccfc0004e716c04694a5d7fdb6b5c3d07779a37efa58d645423910de7f08c",
|
|
||||||
"ea595ba9693e54b92f283a91d6774cf367f440b237d979acda4a75dc78f7c679": "0x2c584ca45e847cd7cd8181e75d88adbda93121a561e7a079f64845e761e15e24",
|
|
||||||
"b5366e5ded52c3db5d81635a624a39d81eb8c639427fc79c539e5c91e17c8494": "0x4f183ea6b4be9cc168c4cc845c98e57d0fcb86f4ab99c2cefa71638851443406",
|
|
||||||
"60d856ec52df0c791d00e6b9ede437774c57ce608b310708351893b7a07ef7f4": "0x46c192e1f6b84d64a7071ba25f6fe763c3213e2be283784e2c9251c0f2ac8b6b",
|
|
||||||
"19546a41867d2e2d5ff2c181524f71f618477244bb14fb28dd4c22885ba4d8e7": "0x3a6b62901551e02a40a271b86e392daf5599909160b276154e4705f1dc939d91",
|
|
||||||
"6e03ddbdaf07cd975626dc72e567427ceaa05108f5ffa1611942cf4006cefb2c": "0xba171c7521c3ea8a7b593e06b06b71efd15a31204f25a2a37daa083606f5b1bb",
|
|
||||||
"54782a51472627bc1a3ca09338fbe95c3ea2bd74e6f994e1b85f0e1d274e219f": "0x69cdfeb343ca5b26ea098719ff98afc8c83d7ce7277d219c78547b3789d7a75f",
|
|
||||||
"2245aec1db780b8dc9f710173256996164f0a65f25a975453e4202a54371d2ea": "0xa2fef090596fa5fe79669f535486abd6ffb976e37c0a968f49c2860525273f22",
|
|
||||||
"14622e51d74bc9eae2b1fb640903c986b5d64d169727710fd90cc9e4a425a417": "0x3d0fb3a37fd970ecc4cb3bd0c3089bba5f6e0fa781bdf6aea8044a898a6c9bb3",
|
|
||||||
"afb21edad247a7d3584836ee721f85b0474120a93c079ebfe7acd48e00b6bfb6": "0x2399512a3d2fe0d752e45c32b1228efb9d0ece7b2cae1a655c0269a23f79f83e",
|
|
||||||
"26f46723ebaf6eb891b2d5709172346d2221838f39a93d644251a9102c3224c1": "0x81a775c7731383a811fc3624e50133d39a601e4c90bcced52eb1108a32e57cce",
|
|
||||||
"e4973bd7bb2b8b78dd63af491582952e28f642a5b26cb2455826e201ae762bf7": "0xbd08fc1a406a362c96c1cca49611f77555ea5189a723da3778067ccff25a6e9c",
|
|
||||||
"a5fd90e292644d5f9b79a1640f464fcae4b8cb925465d197a78185a308603606": "0xe4845968c8b1d603bcd7574af748ea01844ae74cd8f05e1da48bc09635f8e8a6",
|
|
||||||
"997e0bf451cb36b4aea096e6b5c254d700922211dd933d9d17c467f0d6f34321": "0x24832f8e819449010f373a718ea31a6e65824c78114eb84796183ee44b130342",
|
|
||||||
"672fbb7d9ec665cfbe8c2ffa643ba321a047b7a72d7b6d7c3d8fb120fc40954b": "0x3f8e913b50eacc0a513e13f1ded4785eab304c555e9db3e931e6ac93e256b594",
|
|
||||||
"5da40314baa1b85c85172eca23d1193e0395620fa95e732a1d7b3372ff4caf92": "0x6f58c241f1a0535ba05723de1a9469380f95b54a0588e1812a510138a4d44836",
|
|
||||||
"bc1030a0b410ac71bc2a666a70dabaeb1e95ad7c587d6b50752f532a77424e1a": "0xf2e7c39c1f870522cb8cd35ea97f8795ed69821b383b1b09c14017367402f6bb",
|
|
||||||
"5befcdb06599c4126afeb0b20d751d6360a28a880c23222be2ee40be38c1fb26": "0x69eb6cf8bff15034dae014ecba9d6f8f98e79f151cb0556d25b71ad42a447919",
|
|
||||||
"be91a2abdead0f4f22f0449fc58f243d514b6ff3f08b7e61758a5481716f0d93": "0x053d700d30ea41913e52217b02cbac812d056b4e6658799f102f2bb6d23e007c",
|
|
||||||
"576eef18034939eb62e7736f6f9fb7eb6c67b5c6ed81605f4879057028d734bb": "0x8007bb4ac09a10b3c48b0611ee0883a9bb3bf1887238d63a6aeba11770c404b5",
|
|
||||||
"f9c0172ba10dfa4d19088d94f5bf61d3b54d5bd7483a322a982e1373ee8ea31b": "0xf7cec4588bde89d95565976a45b2eacf6538e484a297ee99fcddaaaef3bc9c02",
|
|
||||||
"cd69843b4eb5c5207dafbe82e2b08fb64107a56d2fa026cf260c6d5b8ae67a40": "0xe49c5c71326536a940fb12d8294f3b9b63fd034247cc5df07532afc16c82c396",
|
|
||||||
"ec2bf6a3087d222ce960afcf75b42b96985d580a80fcd4c45c76a5d5e5713cc7": "0x8f02596618b8b04491f689dbe8911f00a929591a514f7888094da1fd2b637f60",
|
|
||||||
"f1063ff9dea7f8052929e97e907218eff557542a59c54a60eb3a945b67759999": "0x8e737f23eb5e0e9a31f5b7c8700d00fd0e6761903932079dbf3ddf9c03eb1e70",
|
|
||||||
"e75bf4f2cf9e9f6a91d3c3cfc00136e3ba7eaeb162084fdad818c68133dc8a24": "0x8d81c86751747808b25001f5b204b968204b6c4ddc463d0257fd5c7109fdb15d",
|
|
||||||
"2206debd84882bbb4852896580279c34f4b5dff225301bf218380828a193a10e": "0xa8878b9e12827b36ec998edcbdf083850ca54b2d5607e52f6772f31db2f0607a",
|
|
||||||
"c2703fcc925ad32b6256afc3ebad634970d1b1ffb3f4143e36b2d055b1dcd29b": "0xd28029b00cea4a5e1b761e97733c6e81b28a7523df28e572297bfeca060f9eea",
|
|
||||||
"23fc699f5966447af3ec895e6f2c046f91d62d40ad1a86e8cde8fd0746324d8f": "0xdbdc4a95896eb11b31bf7e05d9760e48e61310826c01af93936a4d2ff99e9606",
|
|
||||||
"21085c70777592104ad15d352e44fb59f8030398e853b0a0dd2f9b3572ca8f27": "0x5ba9b9f13cd3088564ddc7e2509c7c1d2278fade9c0da6e69b1e5ec46a22d1bf",
|
|
||||||
"e4f18eb4bd03fc316e0affa5c829d8b307315e1bee8b4f7907b3c045be238130": "0xa713a300c388e4e85a62dd00368d90072f77142fbfd1264c813a1bfa2189ff84",
|
|
||||||
"ca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a6": "0xbb63056b69c1c7ec317004aa29ffa44952d907f4153cc4024c6d744d93b4500f",
|
|
||||||
"99137a18354efa7fb6840889d059fdb04c46a6ce21be97ab60d9ad93e91ac758": "0x3c179a93703899a325052f2ebd67e69ac8dc7ed32444684dc06a51d1f3cc410b",
|
|
||||||
"8112fed370f3d9751e513f7696472eab61b7f4e2487fd9f46c93de00a338631c": "0xfe27f35d3eebb19766d3236fea856f3413374248bd17303d95e7708a76352765",
|
|
||||||
"e157999f282bb939e943724620a60af4ea9b0078f34499b840c65bee0c81cef5": "0x083909f31468950f41ea600a031fb0d5ef31e89d95afcf1d28931d7e265c22e3",
|
|
||||||
"e8904012342cef06c7fa8e6123f6db12af8395b04d552ccbf539ae6bf2d7fd69": "0x50602bad8b23e169654599b4b39619298f20bad5bce180938a561f678a6cc3a4",
|
|
||||||
"f26cf0b5c71699e81f59384824c71b8cdcc29ce409f3e6934c8c18abe652a04f": "0x83fe60b4122942f9cb8dd0f3abfbfe96e9ea4fe78bc0d68e0491b663025045d6",
|
|
||||||
"e76e307abc63a0fe6a6cd8bec83a23997aae27b5a91459c3d73b2cf20abf7430": "0x2ee704b37f1c87a2273999c96ac6942a85f06eec53dc67bc5286bf5de92dd078",
|
|
||||||
"0cf3cc70e1449323c5b2c359d1359fe7ac68109e9e927e090ecd71611493a281": "0x313b1425cc401110faee5bb6feb04cbaac9123c868be0f77786158835fe423b0",
|
|
||||||
"a6ea8b18a8649408c374dd83165558280ab580a51dcf1d56b60904d91f49a49c": "0x1e3d25f7734c91a2b92c054c57eebf32b3e522c82570cc3f8d9231a8730816de",
|
|
||||||
"f9917668f24038a383e51c0b019f5d9645d6785c6bf9a0d48483edf82ba5caec": "0x59caccb4fe586682e4c661ed16d967170c2e82a0b4d3e1d74b9403174f94f9bf",
|
|
||||||
"0e60a64dcbd660e87a08eb2cc95e8d84d1126fd7354d377b3fc5730352f4b8b2": "0xf100059d67f725cdc293153e7f7046a00e38977170b2b64ecc301e8daccca000",
|
|
||||||
"6f1fc5f67a2e6370602a4eac61e8bd2c780c2fd9ff17d1bfef1cdbd766014cd1": "0x62b82df8ba253536a22d94eefc2647d8a5bb27655b2de67a3e1b2cfb97d8c26c",
|
|
||||||
"0d4c494b2aba88ba61cab96837efef85080a067493202e49f7ce4c2b2d9f97eb": "0xc578be971ed0042a28c5891f01f5bbb555e83c6e8d2534dfa780cd3525cdd8a3",
|
|
||||||
"7545acf4eb17d5ee383e985a782b68d14dc7ab0cf390143fece48d442240bd6d": "0xf15881d608370111676fa531d9bddbf99078569d96d16c0c575f35f586a7ee66",
|
|
||||||
"c098773aa18ebb7e84d5ee7ea7d97105ab2015a329f670012398cd2c8f5cc6ca": "0x231f4f5a27add02b0e9b26616e0e10cbb012d68c34b0df92d77358c80aba54e5",
|
|
||||||
"13f7925c9186b8cca50dde4bbf2d4fa9705052cceb6f2fc79df827e2b37d6f3b": "0xb2f6e3d43ae8fb1ffaae10db284ec779ee44c7a6044c34d88a0b3ee22aa369a2",
|
|
||||||
"1bd1c59cd425aebf8a931c1b2a902b9a11e7d18dc68021e4a35a5cf24220a6c7": "0xfa1f276189256d5ec6740900ab0df3ef28519c9baa968a8bdb87afe295cd1b2e",
|
|
||||||
"70bf2974182b6ebf4eac64977170074315e7a07d7b58a963758060924ee9a192": "0x855fe0e962ef12fde0d0392e526a9a44e7ef039b39852a24c1958727dda36942",
|
|
||||||
"9e88ba67b02634f5ef90794f0cb50590916bc621d6efe9d1ece4fc593d24bd28": "0x83bee8b14e5a7423e4e792212b6f367d193bd19bcdcbb86399bc24831a4a05d1",
|
|
||||||
"c3036175403e4b32dc291d0c023aa691f0287f058bfde5fff15d71ac68973e73": "0x3e86f5199a2279a3d66092447da149243ca2fbf06c6c397700b0cd742b036c55",
|
|
||||||
"751a17c2f649525a42812450ed3a656933e3bccefa702461a60c21109cb8fcb9": "0x1f26790f20489067da6a4175dfd4207b806589a68cce835c6c6042bdd679a983",
|
|
||||||
"94bce4aee88fdfa5b58d81090bd6b3784717fa6df85419d9f04433bb3d615d5c": "0x8589ba1b932e24088eed2368e3f7ef654e59d84fd9859885b3fac68a60ed2b3c",
|
|
||||||
"334a4429edb95cd4a3455d5133bbb568f9013b3ecb68962c89ee99c8e24818ad": "0xe5ea582ec4e0b12845eee5d361001c5d53780f08cbe30184edae7c3c270e33c4",
|
|
||||||
"bf8bcb308fba8c8e78fcfda6ca73061e1d4ee63b1200493f81ee19e643f5cf0b": "0x76654c6da07c5ec802c0bc6256a60d1aebab1ea056ce6055a1492b6aa8d5ea02",
|
|
||||||
"36032e522b810babd8e3148e9f0d588af9e95e93b97ffb58566b837fdbd31f7f": "0xa55d1d1b924a39c18d5ec73409a3d41801c99b9f6da69954c27090b418716867",
|
|
||||||
"577bde1ece4c8e091a11be1bce3de36aef1f259123449e752ca9e813d2d5b62b": "0x8269855b30df434efc3b77c9f31d348c212801a039957508158aee01d9bd65ee",
|
|
||||||
"026d1f1cf9f1c0ee92eb55696d3bd2393075b611c4f468ae5b967175edc4c25c": "0x0e0e883a1e112af32d51b8e65574e841b4bc9fa8cb397e748adfce33c0499d1b",
|
|
||||||
"7dac7cafc583cc4e1ce5c6772c444b8cd7addeecd5bedb341dfa037c770ae71e": "0xb244788c44ff781b7050610fa1b7d873ba6fd19ccc33ac8b70191d0c11f80fc5",
|
|
||||||
"d5b3be475e19733cedadd74fc619372b553745eab050b935af6a331d29354941": "0x0864eba03de8c852626c9810b8482cabed82ac64e444e56ffb6a9be2f210f0d3",
|
|
||||||
"a29b53fbc56604ef1f2b65e89e48b0f09bb77b3fb890f4c70ee8cbd68a12a94b": "0x44418ff4f7284e65d9f1f0fbb8ac7d50868322cac5cf8d8f82b0f1d6918a887d",
|
|
||||||
"a3cd2f847362125e84d0aebce2d341957b5941dcc07760dbf2782d6300f90128": "0xe3ea7ef34ff3ac2a06cb7a416aae7672627457bd3ffdf99f30e135196e10a519",
|
|
||||||
"3ea98c0336f6a8506dc34567da82178f6f7a664b206ae8eaf8ab8d96721ecccc": "0xbd91fc04427de653bc25a98561484214dc1b87d50b1452c63402cbfb47bcc235",
|
|
||||||
"318e9f183dbc7333461fd7eb62c954872cf863c46bd09ca56887df525e40279a": "0x3650e938787a1396738194c46b9cf32a04b9dadec50b4cf478b16d6b431df4d0",
|
|
||||||
"51ae9b785e6aeb288955720faef15f63ee3ae21af38114ade8b3fc3d3831b5ad": "0xa8152c0e7d1d3f6ea151df6081953e40406b2c7615c956499e5f185f9e55fc72",
|
|
||||||
"2d9315a88f3019f8efa88dfe9c0f0843712da0bac814461e27733f6b83eb51b3": "0xfbfaa1a3320cc0bfd17f2c5cacd165cd1f9c4d078f838b67b8d9d1d6801ec960",
|
|
||||||
"1fc18861232290221461220bd4e2acd1dcdfbc89c84092c93c18bdc7756c1588": "0x06d2b960c7844823e69a8e608effb34db3470e62378a004c50903b94cfd6cb1b",
|
|
||||||
"bf517e0f7ccfc307f0b2fa93b99a737641933989af6af769c928725989c21e66": "0x4502f0e9d9010fc72c39e3804146139a14dbdad40ef7c27d143c14b84563c0c5",
|
|
||||||
"93450e6195add3579e50d7b97fe2ec7e4f0f167d335af4d3fad33b79212558bb": "0x75d03ea87ddad3c4aeb230f6ddc3c1f2a79871b68b6fd35888d782f745f95941",
|
|
||||||
"eb3b5720301b36fa074260e6e27e2cfff3a7c6bbb47564eb218a9a7f2a8c0193": "0x6b2a7427d118b10e560f2f8182ab8d5498c12b8449d124a8345337e2e6e954fe",
|
|
||||||
"31775e1d6897129e8a84eeba975778fb50015b88039e9bc140bbd839694ac0ae": "0x81e917e29d31cb27d12453febeb4aaed59df036026aa7bc1ab85679356e93e86",
|
|
||||||
"d259f1f2344b64184eaed25ebdc8e9012b19a523cebb625ea534f0e6a6b7975d": "0xefec4e278bd78068ea17c70bcbb6981b40e784b39c2d5979768639c0e9cafaeb",
|
|
||||||
"834d3f05278b6f5c963670f437a2267c160914707328f888418902106bcd13d7": "0x56f0b709cf67e8883cb7655185fa29e524515323c0af3892b667e175228ab266",
|
|
||||||
"cb324dafd531712dd31c39969ae0246ee4c6ae167257bcf8ac27e28ca35e6a0c": "0xbf6a065c26206653deb6a575917e33ed5461b7b372103abd0a46b3fa0df36bea",
|
|
||||||
"caf0acd3a8849e1100a737f5dd3890efe1e7a574a9c69e230addb3d41dd859c2": "0x4e5fc01c9ee5c3c2310666382617a4f093d33405c53c478f08bcef92e8e49dc2",
|
|
||||||
"02c1cc29f62ce849611bafc6bd4860e0113300d76db6f95dd753ab76e4f0beeb": "0x743c591268e92514d7e0e281d2a2a0ad771ffebfbe4ab7d8a272e2b118c314a5",
|
|
||||||
"7858a3c2a6cd45d9b6713bb361f665aebd29b951fefe977bb4dbaf0e4606aa6f": "0xc8444fdcec98766ff8d2289ea3c9dd058ef711d182c8a77c2a1c9fd82eb46afd",
|
|
||||||
"8b62866fcd3a25ff9118506444e9fe5171e67c61a049f4b4fdacdbc31ae862bb": "0x9874715de44cd6e3eb045625ca4e0235d275a038fcf506d5fd9bc1356f24c69e",
|
|
||||||
"2249a93e67085c7878bf42e26888bc817788d64654f42c9a3d6a0cb3fe66bfc4": "0xdf5257c2c90c7d0993e97091ba670fe3d59da2098ac2c08e8959bbf3c625b5ab",
|
|
||||||
"50c67b3fd225db8912a424dd4baed60ffdde625ed2feaaf283724f9608fea266": "0x8051460f92772b823f54543e96d79b24d0cb9c1814f4c91dda5c3773769d6eea",
|
|
||||||
"5f70ddbab5034fe97cf8722437f7f3a7f575a9f369e751c9567e2c55c9bb554f": "0x27a820b2ac8aa86cab461571a3b4dd194cbe426d836f9d1823833c1864181404",
|
|
||||||
"d71fc5838e683d30b49539d979af53063250a76cfab4a4ecfa2b3279f26b7b29": "0x484a5e2fffd02ea2b350e49451500bc457e1288365dd482495acac47f8085b51",
|
|
||||||
"e974bc2bee67685ba3e58fc38b1d61578a1ce7703a1f3eb66bd304f8dce89147": "0x7eeea5478425fee934aa4bd7476402936ff84761efc130bc7786f8aec48b4fce"
|
|
||||||
}
|
|
|
@ -1,243 +0,0 @@
|
||||||
{
|
|
||||||
"c572690504b42b57a3f7aed6bd4aae08cbeeebdadcf130646a692fe73ec1e009": "0xb6f968f116973dfe1166f73955f59131282a308d47658bc074e400142a6df99b",
|
|
||||||
"150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e": "0x690fb7e5ed85f981b98b881db07458a8a467ac3d817761ee4d79cf9f801480ce",
|
|
||||||
"dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c": "0x0575742f5fde8beaa28022c9cb8376dde6adc5fbb09c0eb7e34f3c884081bd97",
|
|
||||||
"2356af9529a1064d41e32d617e2ce1dca5733afa901daba9e2b68dee5d53ecf9": "0x3802cab0d68b659c81b66f849c1cfe240112f12183e378ed50c92d2c01a63443",
|
|
||||||
"f0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a": "0x9b3111a3b27b0315f601f560fd1d340a040645f5e99455013b48275efd8040dd",
|
|
||||||
"19d75fde7fee50fe67753fdc825e583594eb2f51ae84e114a5246c4ab23aff4c": "0x081f8f00aec130104ddbd71142733b262e1ba6b4d3ba87b97409080ac3b63412",
|
|
||||||
"2f7c4f738d498585065a4b87b637069ec99474597da7f0ca349ba8ac3ba9cac5": "0xc3f535974580ee827aaffedcb46627cc99eca188f3098b9c8894b39a3742dbf8",
|
|
||||||
"46b8cc9347f04391764a0361e0b17c3ba394b001e7c304f7650f6376e37c321d": "0xd0d5bd619b295970d5aeed38e2a41cba55bc4cc54b9e62978e51e054679c449f",
|
|
||||||
"fee33f2a978bf32dd6b662b65ba8083c6773b494f8401194ec1870c640860245": "0xcaeab2a94f62d3c903d67526bf3bfa55d275f9025ab1f04a79425795ea78482d",
|
|
||||||
"2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d": "0x4733c0aed86e5e9a1a6e71dbebef26d1bb7ed5f6348a7cc8ba21536c2f11b0db",
|
|
||||||
"5c2416ad4b5fe25c38ea2078927d59dad6a1d4110480c0c96c9b4421744f7507": "0x9974f56dcf7fbc5c4ea83d8c0d78a48f95455271da020b38966ab70ea83032c1",
|
|
||||||
"8ccb376aa871517e807358d4e3cf0bc7fe4950474dbe6c9ffc21ef64e43fc676": "0xfc562c8e5534f9376bb23db344ad7f3c8a8309c0a0da8fa76096cd583858d318",
|
|
||||||
"26d53c97247ec18d576bbd23f88078acc22b42168dcb1d29a76501a956e26bad": "0xfb444178d7ad7da262bcb933d04f5539c6af1d48c44811cfc32fa3aa749069de",
|
|
||||||
"5867f5683c757393a0670ef0f701490950fe93fdb006d181c8265a831ac0c5c6": "0xf10573d71f68d054ad838d506ab3fee145d5729c3e2abd5a0d80d8b770498d24",
|
|
||||||
"6672325a220c0ee1166add709d5ba2e51c185888360c01edc76293257ef68b58": "0xa4f7538fdc2d3ed5c95bb6eeb675828a05448ca9fac1508122f6859cd585aba4",
|
|
||||||
"8bf649e08e5a86129c57990556c8eec30e296069b524f4639549282bc5c07bb4": "0x4f6bf454e6fbca35df7161479e0b97080babdbe6dcc20a7bb08c8ece5fb3b33f",
|
|
||||||
"27d108eb764c912f49d3453a21dd95516619b1c45d0b607ee58a137ac8a6f32d": "0x94f04897ac3357c9b992db1b2c196009f9565e3bca313baf2c0bbf9056c40a32",
|
|
||||||
"701223c92a39dbab065c4a7997fef9c41c8de26ca2bf1f808ce0a4ea1cfd421f": "0xc8e50cbe1f871d49d3413cb6ab1b3acc465c9f8f49fdf24eff977eee1a4680dc",
|
|
||||||
"735f591e4fed988cd38df74d8fcedecf2fe8d9111664e0fd500db9aa78b316b1": "0xfc33bf75fb16cd19f86e2b1664320b90f5d945b3b52e1a6e78081e9b99078f0f",
|
|
||||||
"327ae981719058e6fb44e132fb4adbf1bd5978b43db0661bfdaefd9bea0c82dc": "0x2b55f70415ea2b92ba89ed2ea788638af79baccaa79e2c6c7d058e4db56f61e2",
|
|
||||||
"3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5": "0x627fb77633bc7329368baf13bcc5d7a2e0a0e016d95b9685d9711b33eec14051",
|
|
||||||
"97d7d4c20e5a06fdb60f7a448a9e9a779f2b31c3f21121180010a4a470844aae": "0xbafd2c96e0e755436cedc9ddd0a02ff8d8130e4eb6e6522765a7156190feebb8",
|
|
||||||
"f3b50961ff387a3d68217e2715637d0add6013e7ecb83c36ae8062f97c46929e": "0xabc5fab93560a47cc8af9e44b3ff4bd7e4b5daec88b627f3e12b4810e33841d6",
|
|
||||||
"83a6de4ec10bce1c0515d1aac082fd193f268f0c3b62da0c8ed1286319272415": "0xe28188b839c07bc527498e154f6004fa557cc1ce27ba0788f51f52feef69c975",
|
|
||||||
"3112b03a41c910ed446852aacf67118cb1bec67b2cd0b9a214c58cc0eaa2ecca": "0x533e4686be17668b2757b0abdf63040904101979ef677dec0926dd60d548c03a",
|
|
||||||
"fa2d39b681f3cef5fa87432a8dbd05113917fffb1b6829a37395c88396522a4e": "0xeb620c241aa984a843097175eff92dfd9666bc944fca381fbe3424e138bdb8d0",
|
|
||||||
"10946973bfcc936b423d52ee2c5a538d96427626fe6d1a7dae14b1c401d1e794": "0x22c4e1bde114bfedd06eea8246cf21dab1a5851d0e156925ddee3d54fdf20c63",
|
|
||||||
"89a58e1cab821118133d6831f5018fba5b354afb78b2d18f575b3cbf69a4f652": "0x8a72cd8ca670ef27e6e8b0debd89be9f9e22280cc7b8057c0b767a12d92dfa33",
|
|
||||||
"765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2": "0x75fb48e3c98eabf4484e90c51fa9634dc81c9ef0fffc6d7901cf7bddf4a06f49",
|
|
||||||
"2077043ee3b67b9a70949c8396c110f6cf43de8e6d9e6efdcbd557a152cf2c6e": "0xa3a9133b8b0c01a36ae931e3cf940524c40981bce0ebf944e5139390820b0723",
|
|
||||||
"c7b72e5d860034288c9335d4d325da4272fe50c92ab72249d58f6cbba30e4c44": "0xe3e08586ed16a9937a2a3a98967f85ddbba7e331d783483b80fce323cd4dc1ee",
|
|
||||||
"4e53c6ef1f2f9952facdcf64551edb6d2a550985484ccce6a0477cae4c1bca3e": "0x0d2140b047c1764e52ce2fb6c628ceb1c6cdb03c07be0b01d2fa4644ab84e680",
|
|
||||||
"ef94acc2fb09eb976c6eb3000bab898cab891d5b800702cd1dc88e61d7c3c5e6": "0xbc3f7cfc5114ea27c769cdf320641e489371478ab86452fa7b600871d924a274",
|
|
||||||
"af5b9ac426ae79591fde6816bc3f043b5e06d5e442f52112f76249320df22449": "0x557b37d18b817b5b60924cb4b57d3e5ac125ce296a323fae9d1f6da2e4b86576",
|
|
||||||
"67a6f93030420c1c9e3fe37c1ab6b77966af82f995944a9fefce357a22854a80": "0x043e349d0efc9abbc8d7a7a76ea2d548fae6359dff8db809016537cc9999384b",
|
|
||||||
"0b46c1c04e9c914037cc4e0561a7e6787f6db0b89b7b65281f0f6fea1ce45a74": "0xc2909b2472fe0343542d712f0228373e6364569e53a406ee9e35d9a22bb0bf0a",
|
|
||||||
"432a52bde005a010dc32c47733e4595fea0ea04df3b5aaa1c45153a527d646f0": "0xb4581880763d4fd9999ad774d61f06169a0094407575888529db59710b4a0abb",
|
|
||||||
"d3178156b7c0f6ce10d6da7d347952a672467b51708baaf1a57ffe1fb005824a": "0x60994253a3ef9fd4bbc21e22570ac0a659daf036fd4e135324da0b5fa05eb417",
|
|
||||||
"d64da7f265f00c456c2ebadf4593848129b9c86b45523e441d2f5ceb838a89cf": "0xe53c1b5038407e9f0b523c6eea46a84723bb1463364fe83a5210265ae7453a00",
|
|
||||||
"2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445": "0x1b89490bfba1f7eeb2132197bceb6cc5b7465dc8bce09cda937a54af637a3a5f",
|
|
||||||
"ee42016c303126bd9263724e00f83a8114e84518c6e8ffc9738c001cc301daff": "0x7e659a4f98f2915d50c2151bd989ad611e8233b3ba4569da2be20aacdfbe47e9",
|
|
||||||
"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b": "0xb3544b1d945757138f7f7ebf5ba702ec0360ba13c42c9d25dd96382ea9592d74",
|
|
||||||
"d1d95644ffc11ca502f21e067a7814144c56b37018515ced4335a886a827a305": "0x29510890c9ff859f6af73e16f0fa13e9692aa207fec1c5d58a16e6b71d7adf70",
|
|
||||||
"9fb0bd29fe51481b61df41e650346cc374b13c2bab2e3610364cd834a592025a": "0x25fe32d4ba399a020ecdb713c172083556e209e80bbbb3f77fc76e66c300a1e5",
|
|
||||||
"5967c196ca33171a0b2d140ddc6334b998dd71c2ddd85ba7920c35fd6ed20fe9": "0xf1cd59638bac3757b54d897c500da2886de56601236101bda28637706ed66d1c",
|
|
||||||
"3b7ef6c95ceedbffbb66bff3d6135a200c5d0a0466b0c90812510ceaedebaf04": "0xca91cd6b0f008ddabb7dc6faf563a11bdd99844c38230bba0896df0c44f0e202",
|
|
||||||
"12848738d5db3aef52f51d78d98fc8b8b8450ffb19fb3aeeb67d38f8c147ff63": "0xe224b22c03c6ca1cc638d345bc5e419a2301b81eff6c08fecd8545ff0dc8cae6",
|
|
||||||
"6489800bb8974169adfe35937bf6736507097d13c190d760c557108c7e93a81b": "0xd5d65a98b2cc2ef42709050a22c0a4041c8583cf8abdb58a9cc44bce8d566868",
|
|
||||||
"67be9f519b95cf24338801051f9a808eff0a578ccb388db73b7f6fe1de019ffb": "0x418abfd6a1251bd40c9b50bc5af51d80d37a4e18591b2a30854962dcac787285",
|
|
||||||
"91568baa8beb53db23eb3fb7f22c6e8bd303d103919e19733f2bb642d3e7987a": "0x0d6c6d11a0d7f5dc0cadd1d3f9584dd929193298c74254154f9a2bba9410033c",
|
|
||||||
"03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5": "0xfd12d2324500be3676bca3c261d242bb5692c52cfe2afa4a6cce1fb3bc6a4816",
|
|
||||||
"9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d": "0xe787e33e05981bd03351a46f2cb18fc362c645920f9a036b216b209b76c5225b",
|
|
||||||
"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43": "0x4428544fbba3d112587cf510b842eedeb5f91ff7bb7cf7cc36fb5b5a72319236",
|
|
||||||
"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419": "0x068cea3219eda440819e401a0d88bbb225f888abb06cd60ab66fc9a5c465e9a1",
|
|
||||||
"7f4f157e57bfcccd934c566df536f34933e74338fe241a5425ce561acdab164e": "0x4e3b0af02ade7cce8f5611c8fb786a09eb28e84fc1a0e3f046d6a244bdc42997",
|
|
||||||
"b98e7ae8af2d298d2651eb21ab5b8b5738212e13efb43bd0dfbce7a74ba4b5d0": "0x0b14d08c93635d0e747dd2372307d286895fc9bb4494e9c0bd378ad51f02d455",
|
|
||||||
"d052e6f54fe29355d6a3c06592fdefe49fae7840df6d8655bf6d6bfb789b56e4": "0x56e08e9a8329decbe913f5b0b1eea35ac8ac827a8dbaf5a9379006ac613126db",
|
|
||||||
"23199c2bcb1303f667e733b9934db9eca5991e765b45f5ed18bc4b231415f2fe": "0xe46238df7aafb9ea11ed890099cc33e6445e9fbdc8537cf0d76400172bb000aa",
|
|
||||||
"43cddc3e1d0b17fec1cf2a230f46e9319887a037dcee56e053af44d8259fb042": "0xc340ce58ad605dabe36ffdf42c8c365f4a2be54c8da1ba6bfb439200b3734ba3",
|
|
||||||
"8e860fb74e60e5736b455d82f60b3728049c348e94961add5f961b02fdee2535": "0xffefaebe0f0f2508b3605f1140d725476bf549b6f54cb14d9c0179e1381bbe04",
|
|
||||||
"d45392f678a1287b8412ed2aaa326def204a5c234df7cb5552d756c332283d81": "0x7f733d3fcba1c5003c5f163925d410c7212d3370bcf86b2a10ea98116243e9c9",
|
|
||||||
"765f416f2d676848b5016428bc9295fda3e71d5e97b16df75179a378cef040ec": "0xaaa16e55d9dd89e41635b37165cc1d901f825b7dfbcd9c40ef0cf7e070ef41d0",
|
|
||||||
"f2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e": "0x6b33970eedc16ac12e07e9e5488b72edd5010167c6d7ce4783bd54a17a546782",
|
|
||||||
"236b30dd09a9c00dfeec156c7b1efd646c0f01825a1758e3e4a0679e3bdff179": "0x2bb53e525573d21d1187d5c2ba9a7906b01f69b9ddb8c24748656ddccd68e487",
|
|
||||||
"c719eb7bab9b2bc060167f1d1680eb34a29c490919072513b545b9785b73ee90": "0x6a1f63bab3b8bb5b90c52333e5ebb2774737c1ba85fde5097e4c484579535d4b",
|
|
||||||
"c7c60099c12805bea1ae4df2243d6fe72b63be3adeb2208195e844734219967b": "0xf67a2c84883114b27e9a804347a46234ae32d587fbd56d9b4b3e4dd5233cc8ce",
|
|
||||||
"9095653620547ece988ec51486dc7a6eb2efddbce8ea5bedbd53bf00cca84cf6": "0x06e88e2276916acd3bf6bbdbaeedfde1fe80b2425c77c4e08ea20b1143094bd7",
|
|
||||||
"88e2d5cbd2474766abffb2a67a58755a2cc19beb3b309e1ded1e357253aa3623": "0xcf68e33a3bc3841a17bf4928bd9ee9d3204d9ee179a06a690494c36db3fdc390",
|
|
||||||
"b5d0e0fa58a1f8b81498ae670ce93c872d14434b72c364885d4fa1b257cbb07a": "0x2b9a5d4da91b3059edc6d6bd872e41610cbdd945b894c8d467054f0f5b2b6f9e",
|
|
||||||
"a639c04942ebfdeabf25bf1b88d6608ef387219748d77ea130bc2fa486b9614f": "0xaa0b4298e868346cddadac8ad5cdc722dc4b80c1a91057b36a2a7f8f0f8df87b",
|
|
||||||
"37505261e557e251290b8c8899453064e8d760ed5c65a779726f2490980da74c": "0x6a8f9eac547430c7569af634c3f66d863e714317983d2198800bd602d6a35ae4",
|
|
||||||
"70ab610e3ed6642875f4a259dc29175452733316fee440f23fed99154d1d84f7": "0xa7d75b7e766e20b0dcf52318bb9262d1fbc0bf5845d93873d795788e44155dc0",
|
|
||||||
"fd0690232b0fae5efdc402c1b9aac74176383ff7daf87d021554bda24a38e0ec": "0xf72d07087221b7aeca3576250241be5e9301cd2c9e7098cafed12df90ec1e5bc",
|
|
||||||
"bd4dbcbfd90e6bc6c583e07ffcb5cb6d09a0c7b1221805211ace08c837859627": "0x414dd1065f58fd2265d1e4bba4e2628a22d16c05004834e7db0f4f96d56b331e",
|
|
||||||
"5a5d5f7fb72cc84b579d74d1c06d258d751962e9a010c0b1cce7e6023aacb71b": "0xbb5529fe529f8bfe2e2d78bd69b13e3e20e8d674df3d4ba7d3c2e5396543cb33",
|
|
||||||
"8f218655050a1476b780185e89f19d2b1e1f49e9bd629efad6ac547a946bf6ab": "0xd0e566b054f8171e9ed3337902074c8114bf0b869417b903f530cc1c9d7a3a8e",
|
|
||||||
"433faaa801ecdb6618e3897177a118b273a8e18cc3ff545aadfc207d58d028f7": "0x00163a8b12a3f1bf9de16664aabcdd63832e262b6f2025d130022d5d1ea2eba5",
|
|
||||||
"c415de8d2eba7db216527dff4b60e8f3a5311c740dadb233e13e12547e226750": "0x56baceff0dca5a4e903203d7299db74691639ac4c6954e408056675029eb19f8",
|
|
||||||
"fa17ceaf30d19ba51112fdcc750cc83454776f47fb0112e4af07f15f4bb1ebc0": "0x281303954cd2731c4302e730998998c009d6a2594d47c25e530cd56c7a677ca3",
|
|
||||||
"ad2fda41998f4e7be99a2a7b27273bd16f183d9adfc014a4f5e5d3d6cd519bf4": "0x5a1809bce6641551979a9b57c7c1ba2c33e2e8b51601432b576d5e1613e1f3d6",
|
|
||||||
"58f4ee3a0fc4de834a2e96274a696d0f3d8ec45fc76131a6a49fcd18d3ca9812": "0xeb732c4568619bbd79a5dda4c4dc4832905ffe0ff6978ce58efd64250d5bae61",
|
|
||||||
"8419416ba640c8bbbcf2d464561ed7dd860db1e38e51cec9baf1e34c4be839ae": "0xe5253c1e4f90ceadbcbb69d6324044f36da477c2361292ddc5ab1f6e73f22b40",
|
|
||||||
"67649450b4ca4bfff97cbaf96d2fd9e40f6db148cb65999140154415e4378e14": "0x868853ce6cde9050158ada5690870fe0b33868400c8d937ef661ada095389fcd",
|
|
||||||
"63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3": "0xd43d6d18ce07b481f0871337b0a3f1d74972852dac3866b8b59b6d367e2d87f8",
|
|
||||||
"6f9cd89ef1b7fd39f667101a91ad578b6c6ace4579d5f7f285a4b06aa4504be6": "0x846ba321e90a18bdd36bb17e24a931bd67aa9ebab1c61f69dfe798932fb5a691",
|
|
||||||
"49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688": "0x6a57cd5f71e75a80dc4b2a629ba1062be7c017ca42fd4a938e54fe1906834069",
|
|
||||||
"6d0af467543fc7daedf7abed96423877560c8d03725f3e5c87516774982a679c": "0xbedd56a5e0b550598a7491e214e06266ebeab015cd74a1d8df8ced0b18b60334",
|
|
||||||
"6c75e52531ec5fd3ef253f6062956a8508a2f03fa0a209fb7fbc51efd9d35f88": "0xf8583c05f389c74674aa7663026f38f14b844a53bfc3a403c4fbf776ebaadc07",
|
|
||||||
"3d253019d38099c0fe918291bd08c9b887f4306a44d7d472c8031529141f275a": "0x8a246a343c04b730525a476e77fba9464fc2db37b1a41adab1f1f1891717d6f7",
|
|
||||||
"93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7": "0x2da2c95e03f37d2d2e8c37244440f24d19c7d62dad134d5b4dd8c855e287790c",
|
|
||||||
"7f981f906d7cfe93f618804f1de89e0199ead306edc022d3230b3e8305f391b0": "0x49e76e78ed402461e7382ce401ca01cf58498f676521dd288af86644a12c3a8f",
|
|
||||||
"95609d32c98a467a72ac419f2e64bb2b8dbd5b00b74f3a0fd72f42343af1743d": "0xb47aee5df8fc414469091ae1b4e4c0c8caaac8455fb979cf87c05eb53e1379a4",
|
|
||||||
"8879170230c9603342f3837cf9a8e76c61791198fb1271bb2552c9af7b33c933": "0xd91961e22ab01e0b4e543985d0b9eb5407d75a9729fc64353a0ad8f58e4aa17e",
|
|
||||||
"6d881ecf489bb24aa10468ca332e3ea262a9bf3a8fb9db1eadac9cce544b16b1": "0x493ad7286ac642b6ec2acce4b90f9a501df53ed9b8508f5e5dbef0b4a4121362",
|
|
||||||
"2394ce86c7d68050ce52797923860f6c1656a73fb11bd10dacb3f9c719acdd1d": "0x2ebd84d2f7e7a27f6adf6daecc7a8c0a613fc6e4b955bed3712bc6b14b6e4852",
|
|
||||||
"15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864": "0x45168d43a3af945d9f036eff15d264c79700bbfee4ff1def589d07259d8af7c6",
|
|
||||||
"a0255134973f4fdf2f8f7808354274a3b1ebc6ee438be898d045e8b56ba1fe13": "0x3a074bdc92b4897f66a14d802d64d1ef1f86fbc8f4cfa10a72b3e8365ef34003",
|
|
||||||
"2fb245b9a84554a0f15aa123cbb5f64cd263b59e9a87d80148cbffab50c69f30": "0x8c14a293c023cd7b95de90ab95aac7a4afe79d0fad06b67be24016c6462a2804",
|
|
||||||
"301377b122716cee1a498e7930a1836c0b1db84667cc78bbbcbad6c330ea6afb": "0xd562076e43428ff5172e9e11cf925676514440bf6768e86cda740b7096decc1b",
|
|
||||||
"eef52e09c878ad41f6a81803e3640fe04dceea727de894edd4ea117e2e332e66": "0xe186cf9b253b558790d7022ef5d3cd5ddb88c6e87652e3562821acc06012b81b",
|
|
||||||
"d69731a2e74ac1ce884fc3890f7ee324b6deb66147055249568869ed700882e4": "0xf01d528249d69a7ee2a8cf185a5c923201525903622d4655767695ed8599ba36",
|
|
||||||
"649fdd7ec08e8e2a20f425729854e90293dcbe2376abc47197a14da6ff339756": "0x7347eb0d644a2da6e509a8b2f7696843472c0dd3226065e957f45ec6f2f15869",
|
|
||||||
"ed5c2a2711e2a638573add9a8aded37028aea4ac69f1431a1ced9d9db61b2225": "0xbb3a28603301b0624541f05dda7389d4cf7224f5d12c20140a8cea9b5bd1026b",
|
|
||||||
"703e36203020ae6761e6298975764e266fb869210db9b35dd4e4225fa68217d0": "0xf1d362ff6d39c7dad6ebc0c16a81904d1a7f3614959c6d02b3d6e08cca9ad769",
|
|
||||||
"159b09ed169a3cdbd13fd96ef4b3cda54972058906d38a58f5cd327e5df1478b": "0x8226099dfc20f884f3339c01db0913752d7eae1a3e350c6bab77622711a1fb10",
|
|
||||||
"a995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b": "0xd4870e09a36e2ee62e7dbe16e9d1c244410aeb60979614c4df76121a6862b3bb",
|
|
||||||
"b216f7ca372b318985903866e0b6dc44a14564828c49f36d0d363805aa76335c": "0xd26f14421e93a4d5e7fba45abe59ed9a5a2b22c174e2215fccb0e021891b9638",
|
|
||||||
"4b1ddc065d08214eb06878d6130a66665febc3fd201733e9bb481094b5de8a32": "0xdc0c01c3b1eb880e2500fc04fa6769ad1bf832563af3c2fe501ea2e7c8a44786",
|
|
||||||
"4176cd17d4a1fb517b6535e70084ce85e1bcbe707c66b960c8bd5256accc1b2d": "0xa211acda02cc19ae5fef8614085299188111f6f1d928a6861341c76a8fd7499d",
|
|
||||||
"1ce9069708fb49e2f1b062fa4f1be0bb151475ca506939d6d8c14386d49f43dc": "0x00223c8d55871de1144004d47843675d8cf3088b32bf605b2c155dc196f00677",
|
|
||||||
"9c68c0c6999765cf6e27adf75ed551b34403126d3b0d5b686a2addb147ed4554": "0xa09657d175deca19a6ca4eba787d8be37d5bc6762623598007dd25a92cbc764e",
|
|
||||||
"eff690a187797aa225723345d4612abec0bf0cec1ae62347c0e7b1905d730879": "0xd84087a1eacc338655aac7906b638a92e8ac9e77526c3c5d6ecdef36dc7bde59",
|
|
||||||
"e1d3115c6e7ac649faca875b3102f1000ab5e06b03f6903e0d699f0f5315ba86": "0xf173f9743d53f9a67428c86cdcc40c2735f55b6bf66b02532d78c7ab3ff4d603",
|
|
||||||
"0b1e3297e69f162877b577b0d6a47a0d63b2392bc8499e6540da4187a63e28f8": "0x325d448fbee4659a8480be51c4d207b58831bf09087cfda460ed0106ea849349",
|
|
||||||
"6b1381ce7e874dc5410b197ac8348162c0dd6c0d4c9cd6322672d6c2b1d58293": "0x8815331366174347f07e36179e460867f5e460f7150a3295b8b5aeece3d2b483",
|
|
||||||
"3607bf4d7b78666bd3736c7aacaf2fd2bc56caa8667d3224971ebe3c0623292a": "0x65d45de4eaaedf2b2d0988428913f6eea3b23581bf080f005d2d605989fd4bb3",
|
|
||||||
"81a21b01c15b8d01f6cdfed65e00987cc4c901858c821b2089344987de3102e9": "0x88b600db1ec4674c10f91df06c3ebc7021545328b857995aa3945aa4289f8b44",
|
|
||||||
"ff4c53361e36a9b837433c87d290c229e1f01aec5ef98d9f3f70953a20a629ce": "0x5cd26d092f4a1d3a5f6d78fc4ad529493b3fdabd1853bb886737a4d275b00073",
|
|
||||||
"fd05a384ba19863cbdfc6575bed584f041ef50554bab3ab482eabe4ea58d9f81": "0x4b00b756ab54ca659a7fcc307b16b338dfd49c8b6a4cf7d07998d246f1f0f72b",
|
|
||||||
"a5eb88d3ea93f6240d7e54b4466bc1857f7bfc1658d49a07f68096ebc0fdde3b": "0xb1f0bf15509d865d1b611de52eb33ede3767f4601c28d62c2499ef4e5a18aec6",
|
|
||||||
"26852e2d0696e25e6adaad2d7ca3a1f2f15aab68d317ace14d41b4128a7e780f": "0x99cdb56755105d1de3565c8789e3dee656a23e561d1277440c1f35ead22fc948",
|
|
||||||
"8376cfd7ca8bcdf372ced05307b24dced1f15b1afafdeff715664598f15a3dd2": "0x6f3e9051d9d4cf95d2164ebad25203ba413c741bc133525b169747756f5cce8e",
|
|
||||||
"972776d57490d31c32279c16054e5c01160bd9a2e6af8b58780c82052b053549": "0x6f78342af8e9575f6096fece95465e2af4599427a2e232b6fe1867954adc6f84",
|
|
||||||
"0781209c28fda797616212b7f94d77af3a01f3e94a5d421760aef020cf2bcb51": "0x593a2113695d9d60605b2ef4f7b7a3a9e8832f264e58c249b97a79cf00a0a141",
|
|
||||||
"ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8": "0x7ebc795f79ba493870a54bf2eeb4b8e12fe3884d7c626bce8515296e84503652",
|
|
||||||
"7a5bc1d2b56ad029048cd63964b3ad2776eadf812edc1a43a31406cb54bff592": "0x89dfcba3122a3470d794333141d93d53551aaaba5a1717a433e37f6deb6c7ff5",
|
|
||||||
"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace": "0xeb9e2b6a86cafdd3410f254eabe64f1048d1382d9a324f3fbbe61fb9da9bb8e8",
|
|
||||||
"bd640cddb72063e2ede34c6a0baf6699759b9837fcb06aa0e2fbcecb9b65fde7": "0x8ef90489d78228351f2d898d621471b171efd14aa628bf99dc89e33e540202d9",
|
|
||||||
"49601625e1a342c1f90c3fe6a03ae0251991a1d76e480d2741524c29037be28a": "0xfa758eb1ddb64a74853f768a7fa7bd8b243c13f8e9b8202162711146334c265e",
|
|
||||||
"b0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd": "0xa42470d105b61a27c019b5bd30416ebfa629ba0646163bb11eef774b46b1000f",
|
|
||||||
"7d669ddcdd23d9ef1fa9a9cc022ba055ec900e91c4cb960f3c20429d4447a411": "0x74026eb168b50173148a2cf5cf983285cc2701809c3ac25d580da3dafb342a1b",
|
|
||||||
"2f2d17abbc1e781bd87b4a5d52c8b2856886f5c482fa3593cebf6795040ab0b6": "0xcef5b2c20b6a38250ba8e2bb8542091ba2e82209d2c63c35b0a6f8ae7bfcfd79",
|
|
||||||
"6034b1f68b9363dff2cf9d53b1a88fb4d0929c65f34d532db53738853efc00ad": "0x57e58ddc5c907208d5866c1fc184d1dcb0a5eb60b1862875e8458faa5635a0fd",
|
|
||||||
"e0f87bbde799f33615b83a601b66415e850788000cd7286a3e7295f23c1bb353": "0xe90cac728a1989eff73c4712a6f119836a984e09cc955610e62efb9dcab1c389",
|
|
||||||
"5c6c0d2386e3352356c3ab84434fafb5ea067ac2678a38a338c4a69ddc4bdb0c": "0xe170de9672b42ede20a23b739b18aa1404277cf42e403b3494c38d4a7b72b3a4",
|
|
||||||
"f464e36fd4ef2f1c3dc30801a9ab470dcdaaa0af14dd3cf6ae17a7fca9e051c5": "0xd6055e4ad616fd08f983010505e449e67004be63e764d57c3736ddad5d140e90",
|
|
||||||
"831624f51c7bd4499fe5e0f16dfa2fd22584ae4bdc496bbbbe9ba831b2d9bce9": "0xbf4c132fb75caf3244bcb82f56e1b04db21c82868c878d4c509d193be10677ca",
|
|
||||||
"05934526b94a9fbe4c4ce0c3792213032f086ee4bf58f2168a7085361af9bdc1": "0x3a44393121d08b3dca64c3e030ec47f6211eae6ed7d7383622a0680ef310ac10",
|
|
||||||
"9d23a47f843f5c9284832ae6e76e4aa067dc6072a58f151d39a65a4cc792ef9f": "0xfe8ccc5dd7e957c386a16594392ee9e4d53ccd3a1c9c66f3d333df1ebd6bb126",
|
|
||||||
"16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1": "0x1070dedaa1774089600233afee88908a3986201be330876d148f9adf131b1e62",
|
|
||||||
"c81114e16ec3cbcdf20197ac974aed5a254b941773971260ce09e7caebd6af46": "0x6c883438c24569de4bef718304080e65b1ebd6fa532191b9c69f3a36f148911f",
|
|
||||||
"0afa3199e0899270a74ddcf5cc960d3c6c4414b4ca71024af1a62786dd24f52a": "0xe097d4952448a08d78ee1c738db14b796c3f4a602c14db0ecc45af3acf660edc",
|
|
||||||
"2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f": "0x725f0b8a57dd6bcdf1f0b801a1ec0009a58f2f8cec6688bebb9757d365dd4011",
|
|
||||||
"d0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ded4d1": "0xe8c556f8e3441f353f93b6c3697635abfcb69942ac1535db8f4c20c78e625394",
|
|
||||||
"5b1703d7eb9dc8662a61556a2ca2f9861747c3fc803e01ba5a8ce35cb50a13a1": "0xfab0331c077707ba2d63eff0af9df830dbe8875af971fd5417af06f9a3af29f3",
|
|
||||||
"4456d442a152fd1f972b18459263ef467d3c29fb9d667e30c463b086691fbc79": "0xd18a2ee6d59cecab223cefd9f567b388fd2a1ad15086a42ee9086e5c8ecd2e5f",
|
|
||||||
"45b05d03edb6081e7ae536b94b450a42f43e6342791c560a481030b41f9b945d": "0xd9a51d29b7097feb0b56e3573a5aef7426e4bafea2ae4d2ca2d21ae05a48bb0d",
|
|
||||||
"8ac0c70fff57e9aefdf5edf44b51d62c2d433653cbb2cf5cc06bb115af04d221": "0x765146e6c6e30e4a7495f0f77c1817e50abcb4f3877edbc4bd3f199d7c22f6b4",
|
|
||||||
"b3a83dbe70b62241b0f916212e097465a1b31085fa30da3342dd35468ca17ca5": "0xa293eac6352f51b426fe26c0ebd1a2691d4379f25f537688490a0e99f4fad32c",
|
|
||||||
"944f2f908c5166e0732ea5b610599116cd8e1c41f47452697c1e84138b7184d6": "0xc9a6b6937a8d9b076cd6d8ccf43b94bc571d774fae8980e2b4f0ab45a71d6a3f",
|
|
||||||
"385f64d993f7b77d8182ed5003d97c60aa3361f3cecfe711544d2d59165e9bdf": "0xbfb6957c8ec782ad47274c0274097cdfcb209683f79690897b95543c18a950fb",
|
|
||||||
"e65ff435be42630439c96396653a342829e877e2aafaeaf1a10d0ee5fd2cf3f2": "0x020257bd7128134cd6a98db78855a1758811c6ccdfa08d1c6ea7b2b5e154d806",
|
|
||||||
"b881c6dad5dd3dc9a83222f8032fb439859288119afc742d43adc305cef151cc": "0x9bfd9fc818f9e84b99e42040e5f4a3cb17c56df4c3814b89bf8f37a34d76ae31",
|
|
||||||
"20d096e088a9b85f8cf09278965b77aeb05c00769e2ddeda5ea2d07ea554b283": "0x8fae08b5241bc5b3d76fc135b366db9053ff27e83b95c02b39d7df995bc1c928",
|
|
||||||
"ef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52": "0x647a40613ecbeeed6b3044c25cb97566b5f1586493036c88f039e5a7cbf9398a",
|
|
||||||
"ccca1d2b0d9a9ca72aa2c849329520a378aea0ec7ef14497e67da4050d6cf578": "0x149ba54f5d83a4242c1647387de54025e84775ae31b3e401e0505ba9d84814ce",
|
|
||||||
"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a": "0xce1b26252c552fbc27c694b34b0279534d66c1b6ac8a8a15a7e0802756381539",
|
|
||||||
"2dd14c7c38aa7066c7a508aac299ebcde5165b07d5d9f2d94dfbfe41f0bc5f2e": "0x6c08bfd4b367ced7af611e88f0120114ef8ecf3f6c02dda69a3de40b30f078a0",
|
|
||||||
"7507a4629ad0143550666bce2e7cae0b961a0f624f821feaab642fe1be632f5c": "0xaeb0380e0d875da5d2acf558dc2c47c9308104a4b270aa8fd1d039ad9fe1cc47",
|
|
||||||
"107918baaaafb79cd9df1c8369e44ac21136d95f3ca33f2373b78f24ba1e3e6a": "0x929166ca35d9ef586f4861eeb16812a6193d5a0a3d8d6aa25ad0308f16bf2e2b",
|
|
||||||
"c8acad81438490d4ebcac23b3e93f31cdbcb893fcba746ea1c66b89684faae2f": "0x11e6e80d75b9e02f0e7a73c5fd6a037678abbda7c14b6ac53561c5c732b05bbe",
|
|
||||||
"6e89dbed2351e3c85a9ce1c782ca1e34b6ef2c4775f1cb691739bbe6d0697e86": "0xda7e0bd37e3478d59755e44a8b910794379f8983e5dee2fb7ffbf3ba5ad68f8c",
|
|
||||||
"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d": "0x2ac120d486ffb07d41d48bf43ca092ec87ebfab30680faf4ef03314d1026e57d",
|
|
||||||
"70dddcb074263ce201ea9a1be5b3537e59ed5b9060d309e12d61762cfe59fb7e": "0xb1286a78b20a268dee0faadeeac8a366cf50946fc244c1a1121f3cca54b71702",
|
|
||||||
"ad04597ba688c350a97265fcb60585d6a80ebd37e147b817c94f101a32e58b4c": "0x79e1884e5f17f8af3be116a29eced5ed328a802afbad8260e89baf0fc99e7475",
|
|
||||||
"8086320540b3d7b9b4b564e6756a29a9cb91a7cd97d5fafff63841959d3a09a0": "0x107ff0e1f03c691ed9b0011bd1f2ae109b0fc405d3fd80136e7382c25caf3a2e",
|
|
||||||
"3f4b77dd904e849f70e1e812b7811de57202b49bc47c56391275c0f45f2ec481": "0x9024f1b288cb1c7d734ba5978dd18c34d3e0f51f9b4f2a8334fe8d40bf6d01f9",
|
|
||||||
"a4702f0f5818258783a1e47f453cb20b0fbec32ca67260e1d19dfcdd6a4d0ebb": "0x1f1cfc5943e1d662e50e67b99fb770bb05fb1fb30eb3b8360cc91053c980c664",
|
|
||||||
"c19405e4c8bdcbf2a66c37ae05a27d385c8309e9d648ed20dc6ee717e7d30e17": "0x756f2ccf9047a226a763b687e044d4bccfb03e5f1b3d941de7bec90f7748266d",
|
|
||||||
"6d20210495d6518787b72e4ad06bc4df21e68d89a802cf6bced2fca6c29652a6": "0x68cb9005e58ea827135342afc31ba1391832f17321366213a39c3d0087bc4906",
|
|
||||||
"feff234600320f4d6bb5a01d02570a9725c1e424977f2b823f7231e6857bdae8": "0x871596766a4a6876cbcfbdba61d5e098d95db6251659f25bcd25f74d79df24ac",
|
|
||||||
"19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5": "0xe670146c6741b725ab5e2fd550460d035b8aa9dcb66cb666545c4bbef27814d3",
|
|
||||||
"235ddea9f40e9af5814dbcc83a418b98e3ee8df1e34e1ae4d45cf5de596023a3": "0x18086cb9c40bc2a8a3233310def4387724fef0bb13857e136ea2ab48a2d65326",
|
|
||||||
"92eea8ba1b00078cdc2ef6f64f091f262e8c7d0576ee4677572f314ebfafa4c7": "0xa3c0b9d970667d87fffa56a0da7f28e6b3bc30a6cabfd3e8f6685ba17526e30c",
|
|
||||||
"15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717": "0x303928f43b984fca0546ae35b70d8479a353df9e0f6ffdd5158a51dfb75694c0",
|
|
||||||
"35f1e0d9248599d276111821c0fd636b43eef18737c3bb61c7c5c47059787a32": "0x140257ad88a951c3d37101fceb3768775714bb0c6426b38d6e7a30be29decfbf",
|
|
||||||
"9aa471dccea36b90703325225ac76189baf7e0cc286b8843de1de4f31f9caa7d": "0xb3c92f18a4a0cece945d6d36d232e6abc1f19b3609a5ec75c0cffbac29f9d43f",
|
|
||||||
"d57d90cd8554ea0cf8268de30d5ad67fed9a8f11cce5132a49eb687aed832ea6": "0xbf1a106608f6f71fb1ce8331219cbe6cd52093dc9c0d3ebeca90ca7c623b0bd9",
|
|
||||||
"ca3eed9b267293f6595901c734c7525ce8ef49adafe8284606ceb307afa2ca5b": "0x6ec30b18b3e7cd66322218e6e6904f8f27ca45627b20be58efc7479d28853a1c",
|
|
||||||
"d00bd77d97dc5769de77f96d0e1a79cbf1364e14d0dbf046e221bce2e89710dd": "0x78930c93cf2927994325d75d161c77c84c4885b7bebd3f57da954eb719b8d0d6",
|
|
||||||
"05380f8817eb1316c0b35ac19c3caa92c9aa9ea6be1555986c46dce97fed6afd": "0xae174a636ecdeb169c4a42f8c20ce654279d9f54be976814a7eab9caa553ec89",
|
|
||||||
"c80657b7f6f3eac27218d09d5a4e54e47b25768d9f5e10ac15fe2cf900881400": "0x401a6b36ca1be03b62afb72fc3729bd58e773de5c889188d691f2552566217c0",
|
|
||||||
"d37e4513ebe235fff81e453d400debaf9a49a5df2b7faa11b3831d35d7e72cb7": "0x0d1302511ced1c04f538a410aec75c3fdd98a09356cbe6e1c4bcf0268aeed21b",
|
|
||||||
"681e0eb7acf9a2a3384927684d932560fb6f67c6beb21baa0f110e993b265386": "0xe2b124eb856f15621aad931bd3dfe59c7bcc74555ef6c114f32700b5a6157368",
|
|
||||||
"9ff7b9a93df40f6d7edc8184173c50f4ae72152c6142f001e8202a26f951d710": "0xf5bb207f08bc335db2fcfbe0c6b991124739ca6aef4490aecfb0021633d3c23a",
|
|
||||||
"f8d030e4ef460b91ad23eabbbb27aec463e3c30ecc8d5c4b71e92f54a36ccdbd": "0x58eba59d0c838f172f2996b9700b6884ede500c805724849e5b444b665824ac2",
|
|
||||||
"abe4f2b264560a397f38eec024369356e5c1ea4f7aab94729369f144b3d97779": "0x1d5139a3e56f312c5e5c10be74e6da317bbb84edbb37c6caf7ab347253f76ec1",
|
|
||||||
"07ad7b4a7662d19a6bc675f6b467172d2f3947fa653ca97555a9b20236406628": "0x633ae4b37ce1550bb4a0e5c55cb7c70bb59cfa54aa56261295fdeecf1eac23f3",
|
|
||||||
"a1a6465f4c2ebf244c31d80bc95c27345a3424e428c2def33eced9e90d3f701b": "0x4049a33c588398f5c94d3b6b2d451b148c43ab8eeaa2e7d83c3ef849282bd6ff",
|
|
||||||
"e6ccd3f878cf338e6732bf59f60943e8ca2c28402fc4d9c258503b2edbe74a31": "0x5480f43cc0b086935e4220fc77c7572d59a6fe9e7c2cef57a6507430def5cae2",
|
|
||||||
"3b4656b0d92f0e995024c3dacfc28c47d11af83b374a56c26e514e9a7e46a240": "0x95de11d62fb62cfc939af4f6b311bef4c96a13af7360e81658f3d4d54974b788",
|
|
||||||
"be4cb6bf8f18e84b1c4fd6fafa7f048a972be26505bd58338eb66c80faa99483": "0x3911534919fe7be175f74cf4db6d5d9c18554319feace46485c87421111abe10",
|
|
||||||
"b7e3904c08ddd9c0c10c6d207d390fd19e87eb6aab96304f571ed94caebdefa0": "0xddb8b30fcbde7846b99904be0cdcbf2a6b77873f8e7246bed369d6707ce232c8",
|
|
||||||
"06d9fa501fd2bef47265361ca0eaf6e0a97c3b226cea5ab760240f70818581ad": "0xa904b97f02938e3286db15c740d7b8cc7e7ea87c7fef24584463adc630c7482e",
|
|
||||||
"9c479b12a2b2c1051715d4d462dd7a6abbb6dccabf3af31a53f6130a1cd88efc": "0x9e91359f2f244341306653d3da420a54cba72e699205cfa83290fbfb47971b61",
|
|
||||||
"e799f456b358a2534aa1b45141d454ac04b444ed23b1440b778549bb758f2b5c": "0xedf5c28a19358b291815f5e623e49ed07596474c200e287cf4f23b5ccf6bd6cd",
|
|
||||||
"5b70af49d639eefe11f20df47a0c0760123291bb5bc55053faf797d1ff905983": "0xa61677c7fda3c869db3aa6ffc3df6296cdff1134719422354dfaf5bb83e1545f",
|
|
||||||
"67aed5a24fdad045475e7195c98a98aea119c763f272d4523f5bac93a4f33c2b": "0x508027546cc92b430f9601a01f301391e39d1bd687fe2b399567ec7faa390e41",
|
|
||||||
"5de33a9112c2b700b8d30b8a3402c103578ccfa2765696471cc672bd5cf6ac52": "0x9754210c1804a6b65a3ba2612b0a0c109b60354cc802a2d5eafe84ef76e0f5d0",
|
|
||||||
"78a3e3b8e676a8f73c439f5d749737034b139bbbe899ba5775216fba596607fe": "0x71ad87ab2bbba663f77aac0a4945a93a7bfb21f3664d91b29c15ed99040f8bbe",
|
|
||||||
"84c2dde9633d93d1bcad84e7dc41c9d56578b7ec52fabedc1f335d673df0a7c1": "0x0297d202195fd41c4152cd474610074f2563e6f44807ecf42f5c63c796a53d63",
|
|
||||||
"c9e9d228f565c226dfb8ed5f5c9c4f57ab32b7ade7226c3239ff20911a9c3a7b": "0x385ae1ad494712516b4316a7f3c16030250020a9b15efeba9b4d001f2599c051",
|
|
||||||
"70cd05521e3bdeaee2cadc1360f0d95397f03275f273199be35a029114f53a3b": "0x5a30cddba6a21106320366eaa5053b48a45c9b0d9c38b36f10c55de20e74144a",
|
|
||||||
"5bc91f13e412c07599167bae86f07543f076a638962b8d6017ec19dab4a82814": "0xce72042c196a3bdc47658b525f95407251a9428a83a3377fd51637471cf0e86c",
|
|
||||||
"baa284eaf23edf975b371ba2818772f93dbae72836bbdea28b07d40f3cf8b485": "0x62f2403f3470ebdef88c3dd22a402b02f14dd5801307409b639239bd22e27f39",
|
|
||||||
"6b701e292e0836d18a5904a08fe94534f9ab5c3d4ff37dc02c74dd0f4901944d": "0x5116298c002c1e37c9801e6853eece63a962115213db0fa4a49303955ee00dc8",
|
|
||||||
"c2289a6a43d2ce91c6f55caec370f4acc38a2ed477f58813334c6d03749ff2a4": "0xbe4ea6a4d49736d4a3d6d96ae0a5055ed5372ab7e6d3d72abaa32d69058469cf",
|
|
||||||
"b00b60f88b03a6a625a8d1c048c3f66653edf217439983d037e7222c4e612819": "0x30f3c5f93666236348fdc7207427741e27342602f236ffa761114d17108f955e",
|
|
||||||
"e13b1c1ffb32f34e1be9545583f01ef385fde7f42ee66049d30570dc866b77ca": "0x82b57fac17738db916e60e25c7da72bc744b981565e08f78abb9616caa0b3b22",
|
|
||||||
"b962539d0fcb272a494d65ea56f94851c2bcf8823935da05bd628916e2e9edbf": "0xddc9e159f69768ab723666dc15f1bd906b0bb2cfd2752b62bd92691459d5cf6d",
|
|
||||||
"78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501": "0x6d6c7f0b6508af7faa61044ff392fc8f7034b9ba237a1e64ea0fcbb83914c3c5",
|
|
||||||
"c63e2a7f37a04e5e614c07238bedb25dcc38927fba8fe890597a593c0b2fa4ad": "0x41c91ba219d7af23a1eb4f89df0599a229a60719d8cc181dba3db774496e80a5",
|
|
||||||
"8ff1200345393bb25be4f4eeb2d97234e91f7e6213f3745a694b1436e700f271": "0xb3ec595dfe31a7a5bbc34a9120230dd2243d84988d79d3944ebfc9051b913d89",
|
|
||||||
"cfd44471407f4da89d469242546bb56f5c626d5bef9bd8b9327783065b43c3ef": "0xd2a6d3112f39345a30692c389f071b293e6175737706a691bcb3bf69f877f3aa",
|
|
||||||
"1021a42d623ab4fe0bf8c47fd21cc10636e39e07f91e9b2478551e137d512aaa": "0xa1dad8dd9cea416bfd789732606668c3ee8b5118dc54f2f19627834d7a092819",
|
|
||||||
"3dd2b63686a450ec7290df3a1e0b583c0481f651351edfa7636f39aed55cf8a3": "0xd7df130dcda9b2f2c3e437940d55d225cf594354a0b02de2b19a2b2b15d9b993",
|
|
||||||
"c1751e085ee292b8b3b9dd122a135614485a201c35dfc653553f0e28c1baf3ff": "0xa7fd5e025b891d334e4a3923aad7dc69454ada52bb9791669ec881bc8251a87f",
|
|
||||||
"6aac625e125ada0d2a6b98316493256ca733a5808cd34ccef79b0e28c64d1e76": "0x3b19ade0936c6b7fe8f8880e20975f10a980b960edb1b2e745c2001fc03ad6e8",
|
|
||||||
"a19d04ac696c7a6616d291c7e5d1377cc8be437c327b75adb5dc1bad745fcae8": "0xdc754ecf151ce912b20854fff885227a7aee5174c43dd8a82ae31f86b11152c1",
|
|
||||||
"1dcf38b0206d27849b0fcb8d2df21aff4f95873cce223f49d7c1ea3c5145ec63": "0xaa4121fdc7231b8e69a1013bfbb77f33809e742057583cdf98ce052c214942ba",
|
|
||||||
"389d889017db82bf42141f23b61b8de938a4e2d156e36312175bebf797f493f1": "0x010414e5bd8c0207a0f854274075408ce2923606da87accaab8486851b10a634",
|
|
||||||
"6ed3c7c4427ae2f91707495fc5a891b30795d93dbb3931782ddd77a5d8cb6db7": "0x0426ae24d6351a48242f0eba794a6b22f4c79839d50694a2b7a9b0de0cbf7bee",
|
|
||||||
"48ce0cf436bac22dad33551dfe2eb7bf9991e419a05f25aed4e90c29c3a1cdbe": "0x1da3431d92ee78272aaff4f207171138b16844d91e7134ac392d2ebee4815e22",
|
|
||||||
"1888f463c27997174f97d2a36af29bf4648b61a5f69e67c45505a80f826bb785": "0x22f3da8a4ebdeaf6a29ed5422960a62040daab2cd0d1e673d68a8d4d44da1835",
|
|
||||||
"07a8f31e8910c3b52f338d2aca6f4dc2404753ebafcdf53290ef4993911a71f8": "0x41e2a7778d36d25ed0508f8cdfda395574ec853faf2d11e69e7ea451cdfaa3c4",
|
|
||||||
"23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744": "0x2b35fc431e0c7533fef132e3a6a569d09dd92285305e9c876cb4dadb1a039b68",
|
|
||||||
"396a969a9c1480fa15ed50bc59149e2c0075a72fe8f458ed941ddec48bdb4918": "0x000ee451a8b800512bcb2f9d03e8f3649cfb8c803c632b56d3bc165074fc20f4",
|
|
||||||
"b82449fd728133488d2d41131cffe763f9c1693b73c544d9ef6aaa371060dd25": "0x0a18f3930026fb51e1e3964a65fea3425fe13ff2a09a71e3d4c9dd28ab4879d9",
|
|
||||||
"6e3f3fa8253588df9326580180233eb791e03b443a3ba7a1d892e73874e19a54": "0xf3c0d2d98958ef9e677084cc0068bc48c6f07606708c64b06a09a0483a7b7531",
|
|
||||||
"ee70804471fe22d029ac2d2b00ea18bbf4fb062958d425e5830fd25bed430345": "0xa7a6fb1ea440bb5c0ada4a0a9459e904c7ae2443d92e72cb53eb3b9d192f843f",
|
|
||||||
"c3d5d8d6d17081b3d0bbca6e2fa3a6704bb9a9561d9f9e1dc52db47629f862ad": "0xcb826a89a5331cf23436ac1fd0ea2adb46698c880fc7152a20f9300d0e05776a",
|
|
||||||
"23245bb74254e65a98cc3ff4a37443d79f527e44e449750ad304538b006f21bc": "0x77fc923adc5c78bb969bcaadcb840f32acc2ebbcd327987c056a7d7ca0d96d6c",
|
|
||||||
"4457960559b812558bb0f8cb7912f8bcb843eb801a3133ef45be998630ff8c05": "0x108e02825bf4d1b4a371bd839915feabb34675d5442dae9f41080d7eccc2b450",
|
|
||||||
"59671f59d12dc81bae078754b7469c7434528a66d3fa91193cf204460c198f9b": "0x737bbb7c8fa169933b93ed6de89074a8933c7d05113726e3f4f31e5eea7059a2",
|
|
||||||
"956740a4e169e90bb141abfe93652ae3434693bc7ca43cbcea6471408f19ab90": "0xfd08b4637699978fee0a4a5d4257582e6841c253794ca5fd4dc0fb54d31fcc89",
|
|
||||||
"8cdc9b2118d2ce55a299f8f1d700d0127cf4036d1aa666a8cd51dcab4254284f": "0x723470143332c8f375823c5c6a85bc8d0b26e974eb4a55ea05c8374d75f7c991",
|
|
||||||
"39d020f60982ed892abbcd4a06a276a9f9b7bfbce003204c110b6e488f502da3": "0x0af856c1799c48dc8ac882ed015afc093d32210d831b270e3b6a43b9f8077b6c",
|
|
||||||
"097d687437374051c75160d648800f021086bc8edf469f11284491fda8192315": "0xbe069cc5122df358b63d8a4686fa079ec52c5a6d58c5ee6fc9c78976e05f353c",
|
|
||||||
"9f383d612ac09c7e6ffda24deca1502fce72e0ba58ff473fea411d9727401cc1": "0x4a8944797dc1845f5a3617b7057c01d1714bee6d41e808cf038632f6ae811212",
|
|
||||||
"846ae1bdb6300b817cee5fdee2a6da192775030db5615b94a465f53bd40850b5": "0x8183a78bc77dda0a9df8441ca8a2bc2b18e9e883e04b36ac08996ed4691081c7",
|
|
||||||
"856aac602516addee497edf6f50d39e8c95ae5fb0da1ed434a8c2ab9c3e877e9": "0x66d181f1031dcc934fc7b787ff7181560c1fed490466247a4966aba26fcf31b8"
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,198 +0,0 @@
|
||||||
{
|
|
||||||
"4e53c6ef1f2f9952facdcf64551edb6d2a550985484ccce6a0477cae4c1bca3e": "0x22d83073f60ede68f262043f367d457b161761884cd24bb17666e8c196b266eb",
|
|
||||||
"c63e2a7f37a04e5e614c07238bedb25dcc38927fba8fe890597a593c0b2fa4ad": "0x813dab097dc9a913a37553dc21a51ec264c5b3018a9148530ee5d4131d9cd948",
|
|
||||||
"389d889017db82bf42141f23b61b8de938a4e2d156e36312175bebf797f493f1": "0x12cd27871301e7b10488d294b21fdca0e02208d60d966cc363137c432bce49dd",
|
|
||||||
"6489800bb8974169adfe35937bf6736507097d13c190d760c557108c7e93a81b": "0x8f011dc003102d272bcfb9a1423ed9ab16bf8720102888dbdf3481dc2b81fe52",
|
|
||||||
"703e36203020ae6761e6298975764e266fb869210db9b35dd4e4225fa68217d0": "0xbff692a9a42736393001e997f0895203c81a0b0d7d100177150d3ca2404c2264",
|
|
||||||
"2f7c4f738d498585065a4b87b637069ec99474597da7f0ca349ba8ac3ba9cac5": "0x7b06c8e0204faba400a6b69c75b51fe84ef24c4251340f4b00eca37852ef9944",
|
|
||||||
"12848738d5db3aef52f51d78d98fc8b8b8450ffb19fb3aeeb67d38f8c147ff63": "0xc9c0f5b0c331f02792cf47a6136fdea01772aa6e8bcd0acd7927b2cbf0c9500b",
|
|
||||||
"6e89dbed2351e3c85a9ce1c782ca1e34b6ef2c4775f1cb691739bbe6d0697e86": "0x73198faa767ea791159fb8c64c71ff490793fbe1abec0af9d959653739b86242",
|
|
||||||
"d69731a2e74ac1ce884fc3890f7ee324b6deb66147055249568869ed700882e4": "0x7786857b0713ec6b060c873ba9ebf70cdbe8770453214aa7129e0965d3a8725d",
|
|
||||||
"b962539d0fcb272a494d65ea56f94851c2bcf8823935da05bd628916e2e9edbf": "0xd9b07adaceffb21296de31b46ef0f1db8825a83098d22af07f60205c6394bdd7",
|
|
||||||
"15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717": "0x2b9e4beab792ea64bf6dea7d1d4455a6ff70744602a73388b3d03fc58cc0eca4",
|
|
||||||
"6c75e52531ec5fd3ef253f6062956a8508a2f03fa0a209fb7fbc51efd9d35f88": "0xe6eb8bc3a9cdab5955a78ebf0dd3f5e4ed3458ab4491285345dd8a6d0aecd2af",
|
|
||||||
"8086320540b3d7b9b4b564e6756a29a9cb91a7cd97d5fafff63841959d3a09a0": "0x29405b9f25ad9deb23357298732edb4383d3745ffd9a0373cf3028992d85cf99",
|
|
||||||
"d37e4513ebe235fff81e453d400debaf9a49a5df2b7faa11b3831d35d7e72cb7": "0x94223482aa78b4dc59f670ca42c8c9a93b90b0c21721f6a9d679e3f5a50e4434",
|
|
||||||
"b98e7ae8af2d298d2651eb21ab5b8b5738212e13efb43bd0dfbce7a74ba4b5d0": "0x6f5059e755771ad838278b6407a769717b40629f4655bfe9c2afe781cce5d966",
|
|
||||||
"dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c": "0x08eae5969d90a4f03e33582077407608f74df4ccc5273cae3236710f68dc348e",
|
|
||||||
"4b1ddc065d08214eb06878d6130a66665febc3fd201733e9bb481094b5de8a32": "0xe883778d404e7c9eb7ff6fa190e8ddaa26a1b175c02cb00b1b72a4390e38c5f7",
|
|
||||||
"bd4dbcbfd90e6bc6c583e07ffcb5cb6d09a0c7b1221805211ace08c837859627": "0x0ec8b3c28c4240c5acc6c7ff145310d6d2129e6b718189be9c36828d75cf136e",
|
|
||||||
"150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e": "0x72f36e3b229031b91718b533cde17bf48a3222f4821486f47801671f8d584308",
|
|
||||||
"eff690a187797aa225723345d4612abec0bf0cec1ae62347c0e7b1905d730879": "0x35f9fa1bc253e91cfb42396800a37886b7d5fda5e015a9a5d7eea24b4a516421",
|
|
||||||
"f2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e": "0xc6e1c6307fa87aa0f3c8e33ce786c6a80ca4aa6de74b8e1a62d9e65ad1047aac",
|
|
||||||
"58f4ee3a0fc4de834a2e96274a696d0f3d8ec45fc76131a6a49fcd18d3ca9812": "0x75b7db1ba4946126fa9193d4d00216cd1a52a17087c35feda74905bd0386c076",
|
|
||||||
"16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1": "0x1666ee917cb925fd3d78da42bfb14c8aa2f51ba1fdfe7a424220fa709133426a",
|
|
||||||
"2dd14c7c38aa7066c7a508aac299ebcde5165b07d5d9f2d94dfbfe41f0bc5f2e": "0x7ceb15c8e72d0b917103e43a695e94e40dc653bccbc0806bb71d3ea6539884da",
|
|
||||||
"b3a83dbe70b62241b0f916212e097465a1b31085fa30da3342dd35468ca17ca5": "0x663c14c977c46b85b5ea3f1a97ebc5b93d8cf6cf2c94d01dbcfaef0d0ef9efdf",
|
|
||||||
"5b1703d7eb9dc8662a61556a2ca2f9861747c3fc803e01ba5a8ce35cb50a13a1": "0x8e812924daaf7dc02188976e71d20d86baaf90129d1c1f4470b7e79084fed804",
|
|
||||||
"0afa3199e0899270a74ddcf5cc960d3c6c4414b4ca71024af1a62786dd24f52a": "0x54499295661a8cfb2c4da4184e330ab5948c4ec7522cad5f96e923b97bc91e61",
|
|
||||||
"88e2d5cbd2474766abffb2a67a58755a2cc19beb3b309e1ded1e357253aa3623": "0x3c90b83f0acb025336debeb37d6014cdc788d9bece7828eb1412ebe44a01d31f",
|
|
||||||
"9aa471dccea36b90703325225ac76189baf7e0cc286b8843de1de4f31f9caa7d": "0x0ffe43da21a5d957c833d778b0f527b82980f1b210cafa592054f0a026b658b4",
|
|
||||||
"f8d030e4ef460b91ad23eabbbb27aec463e3c30ecc8d5c4b71e92f54a36ccdbd": "0xb9792f919aebd4ce7eb2a4c4b400dc40c2260f81b516e62cd3bb16a2f1cdaec3",
|
|
||||||
"6b1381ce7e874dc5410b197ac8348162c0dd6c0d4c9cd6322672d6c2b1d58293": "0x784f3db957f968930f9ac749c9b61ef614716964d93e689a482e15c665cf210e",
|
|
||||||
"91568baa8beb53db23eb3fb7f22c6e8bd303d103919e19733f2bb642d3e7987a": "0x847b4e30707fbaedbe1ebf261a9c08299b53389def13b6268f0aaed06118b711",
|
|
||||||
"6672325a220c0ee1166add709d5ba2e51c185888360c01edc76293257ef68b58": "0x243536ac6942683448eb0f0013540ee72a6d31dd4f6efebb44a0918de2234a67",
|
|
||||||
"9d23a47f843f5c9284832ae6e76e4aa067dc6072a58f151d39a65a4cc792ef9f": "0x421f3e1cc42aa5cfd4dc87de41c16bde36a9dffb3392bf61c70d6b3f0ba73a99",
|
|
||||||
"be4cb6bf8f18e84b1c4fd6fafa7f048a972be26505bd58338eb66c80faa99483": "0xf6bcaef2cb75a98bf2c16af8e0b0a36127f865be99a456ebbbbcfc2d54632fc2",
|
|
||||||
"6f9cd89ef1b7fd39f667101a91ad578b6c6ace4579d5f7f285a4b06aa4504be6": "0x2ef5a5df964ff7cecceb968fbe84e8e12e6048518ab3c24e9343b46f6d1dd011",
|
|
||||||
"8ff1200345393bb25be4f4eeb2d97234e91f7e6213f3745a694b1436e700f271": "0xc38286eec0a9bdc4f7f8ebff7070bf4441ddb06af48cca506cd5477f72a1ec56",
|
|
||||||
"846ae1bdb6300b817cee5fdee2a6da192775030db5615b94a465f53bd40850b5": "0x8190db687f806ebb5a85e19789a969680e0fd8380724c4f51353ed0fd57d0a35",
|
|
||||||
"f0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a": "0x3192a035740b7d8a9a2f34e87983f43052bda1a8df4f257dba38d0d021b5afe5",
|
|
||||||
"49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688": "0x7c9f660c492c80357be785fb2b2eeb37147343740244975bc9622311281c945c",
|
|
||||||
"05934526b94a9fbe4c4ce0c3792213032f086ee4bf58f2168a7085361af9bdc1": "0x6535ece8ec0e0a6a6f1baf5b80f64bd8d5c18fa2f40b5023e495ad02a9564a49",
|
|
||||||
"cfd44471407f4da89d469242546bb56f5c626d5bef9bd8b9327783065b43c3ef": "0xe6638d450412b1934890a43d48606d91ad5c945a25ace66f211ccc9f606cf405",
|
|
||||||
"ad04597ba688c350a97265fcb60585d6a80ebd37e147b817c94f101a32e58b4c": "0x25325258fd0fb6965aedf380cde6636109d6e3b6c2faa47ec91d2f976bbae702",
|
|
||||||
"a19d04ac696c7a6616d291c7e5d1377cc8be437c327b75adb5dc1bad745fcae8": "0x537d0fd5f9576506fce8c81f976a5e7dd183ef875585e78cde420baa9c2dc0cf",
|
|
||||||
"feff234600320f4d6bb5a01d02570a9725c1e424977f2b823f7231e6857bdae8": "0x342f11fa43dbe19d0d5097f28526f4c40a7c9e84097a59d66bb619bff59d971b",
|
|
||||||
"2356af9529a1064d41e32d617e2ce1dca5733afa901daba9e2b68dee5d53ecf9": "0x300a7f0a24b012be8b90b21761624f1da3109b33bf47d8b0e34816b824ce2472",
|
|
||||||
"856aac602516addee497edf6f50d39e8c95ae5fb0da1ed434a8c2ab9c3e877e9": "0x88f936c9b272a119b80045783f70f119b5d7214242c2ffa1dab67c1d2645043c",
|
|
||||||
"70cd05521e3bdeaee2cadc1360f0d95397f03275f273199be35a029114f53a3b": "0x3aa76ccda83a8025ad9d12ae64b8efff22fbefa2edee12ddb6a8ee62c15db628",
|
|
||||||
"19d75fde7fee50fe67753fdc825e583594eb2f51ae84e114a5246c4ab23aff4c": "0x1e81c65a2bb74c8870cbf7620003dc978623b83da4f8ad0615d02a4c8ee9be71",
|
|
||||||
"07ad7b4a7662d19a6bc675f6b467172d2f3947fa653ca97555a9b20236406628": "0x6728f81af4b438713f0a6bafac0a9c5b19559fcb8c9c3da9107a5c5715c77150",
|
|
||||||
"7f4f157e57bfcccd934c566df536f34933e74338fe241a5425ce561acdab164e": "0x4f8d4f109c805cf57b95add8534e96c2652cf80fc9d6b390797367361c6f9f87",
|
|
||||||
"8879170230c9603342f3837cf9a8e76c61791198fb1271bb2552c9af7b33c933": "0x393e4f0af86f2b7c4f6cf87053a90fce28be9507462183c08112ab680f5b222b",
|
|
||||||
"9c68c0c6999765cf6e27adf75ed551b34403126d3b0d5b686a2addb147ed4554": "0x5e5f1fa6a90893daf6400a009781b4e146a9714c9e432719d3dd970d58782dbc",
|
|
||||||
"3112b03a41c910ed446852aacf67118cb1bec67b2cd0b9a214c58cc0eaa2ecca": "0x25a108e8fabff628d547ade6e7fb5ffba5e3fc4a86d5563c7c9c3f7f89c2838d",
|
|
||||||
"93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7": "0x969a55ba2749858a67b5ac3740218859ff91958711a4726e4729b6358c592541",
|
|
||||||
"83a6de4ec10bce1c0515d1aac082fd193f268f0c3b62da0c8ed1286319272415": "0x3d4f0ed8ede749b0b7969a845a78a3e04052c5bd67632f9ca3e6b8c95e0471e0",
|
|
||||||
"d00bd77d97dc5769de77f96d0e1a79cbf1364e14d0dbf046e221bce2e89710dd": "0xa2621adcdd0a0eb0856a4bbc95a7a29ac2576915025f1ffff42a0387c659bd0f",
|
|
||||||
"baa284eaf23edf975b371ba2818772f93dbae72836bbdea28b07d40f3cf8b485": "0x7e427b11a67228418d02657537dbbe12e653fb6e25c0553e6cccfd93e09b62f9",
|
|
||||||
"e65ff435be42630439c96396653a342829e877e2aafaeaf1a10d0ee5fd2cf3f2": "0x6bc83acae136c07fb371388c5701aab8c4093719964434c48fcbb24fcd242302",
|
|
||||||
"2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445": "0x6da106d1876e1ae75110398ba4b4170b8617fdfd7f765682fc2556cfd8fad477",
|
|
||||||
"23245bb74254e65a98cc3ff4a37443d79f527e44e449750ad304538b006f21bc": "0xdc8c7a10228f753c4a806f00e624f6d5111bcb01fa1a25e49deb8eab5ef3b959",
|
|
||||||
"3d253019d38099c0fe918291bd08c9b887f4306a44d7d472c8031529141f275a": "0x41810c3ebd3ff83df1d52fce4ae30ae393defeada8c35334f658b552e702a808",
|
|
||||||
"7f981f906d7cfe93f618804f1de89e0199ead306edc022d3230b3e8305f391b0": "0xa59919df888ea0a69aeeb865145ee208e0b5e96e744276097dc5d370ce12c937",
|
|
||||||
"5c6c0d2386e3352356c3ab84434fafb5ea067ac2678a38a338c4a69ddc4bdb0c": "0x094c553dcaefa8daccac6512a27b6bd518962acac070c4a90fd4cbcc7d93cd2d",
|
|
||||||
"78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501": "0x7cc9590c0632c06b336a729fb338855fa50a4c1f56f6bf19792607545ebfce75",
|
|
||||||
"35f1e0d9248599d276111821c0fd636b43eef18737c3bb61c7c5c47059787a32": "0x0beeaa7af57e04218e931c260a19f7cd5d73728ca9b992e7eaadda5a92352a6c",
|
|
||||||
"8376cfd7ca8bcdf372ced05307b24dced1f15b1afafdeff715664598f15a3dd2": "0x5be5a532a4234472bd42f648c860cc6ce505f4abba1d1ff280c307edaa91c6e5",
|
|
||||||
"831624f51c7bd4499fe5e0f16dfa2fd22584ae4bdc496bbbbe9ba831b2d9bce9": "0x970d1a400036ee4ed970edc5fc28c1e1a063fd70abaa5635609f84fda603477c",
|
|
||||||
"681e0eb7acf9a2a3384927684d932560fb6f67c6beb21baa0f110e993b265386": "0xb9b0291e4443cf2919528d4f190963f59f73b2fa60d042ab6d3525ea747e012e",
|
|
||||||
"c7c60099c12805bea1ae4df2243d6fe72b63be3adeb2208195e844734219967b": "0x84acdb9701e59d7fe938dafaf9d84161838cb862e84f307124a1b1e81e6b77d1",
|
|
||||||
"8f218655050a1476b780185e89f19d2b1e1f49e9bd629efad6ac547a946bf6ab": "0x9be7c21f6f7d2b6271fe5dfa45f71c067b0a680aa1ca46ff436afba19336059f",
|
|
||||||
"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace": "0x4e959b3d766a38dd63a3dccadda27ee46608b13a0a17d66ba50f6c6b43794492",
|
|
||||||
"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d": "0xfdbf22be9ca4e8be48886404f4eda806287824318d22fbd8bbea6a06ff21a749",
|
|
||||||
"7d669ddcdd23d9ef1fa9a9cc022ba055ec900e91c4cb960f3c20429d4447a411": "0x82f7cc493ac5c0c0e32c5797cb61372a985439b996ae320926df3eaf982255f9",
|
|
||||||
"af5b9ac426ae79591fde6816bc3f043b5e06d5e442f52112f76249320df22449": "0x06e3b2601f985409297e81f89b64df8a22e4bda271630322b723c799b3ca558f",
|
|
||||||
"ca3eed9b267293f6595901c734c7525ce8ef49adafe8284606ceb307afa2ca5b": "0x60cf8eb3bb66b9f1ee5ad5971ce24f85750ed6d65357278cdd24508018c0fb77",
|
|
||||||
"b00b60f88b03a6a625a8d1c048c3f66653edf217439983d037e7222c4e612819": "0x2819077ee5dc736f75d74505f2686240d84618948ec7c94ac67139c8335c3dfa",
|
|
||||||
"e13b1c1ffb32f34e1be9545583f01ef385fde7f42ee66049d30570dc866b77ca": "0x0948ff7e93869e56cfa994a8611af061dab31d429017b64cbdbdec687807a4bd",
|
|
||||||
"8bf649e08e5a86129c57990556c8eec30e296069b524f4639549282bc5c07bb4": "0x59432d2fe5002ddeb6d4b245cfdc6ee8a0b441ff2fb5a9d154f12ef526f40d86",
|
|
||||||
"03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5": "0xc7dd91bb190bb6b918bcbc1671b8820088e5aab9502236f55ed204aae8d437c7",
|
|
||||||
"d052e6f54fe29355d6a3c06592fdefe49fae7840df6d8655bf6d6bfb789b56e4": "0x97e8f6a69d1e3bd5a9aea5cbc12ebaf74a2268c21220306c5a4fcce978c3134e",
|
|
||||||
"84c2dde9633d93d1bcad84e7dc41c9d56578b7ec52fabedc1f335d673df0a7c1": "0xf8a94a60b67fc29212788ff0d125bd00a78873ce64a5f166989fa0a8a6051880",
|
|
||||||
"972776d57490d31c32279c16054e5c01160bd9a2e6af8b58780c82052b053549": "0xfc6f0ecf57581be16f246383c1b0d39d27d47fd96097b77dd3d9a052f7efd9e5",
|
|
||||||
"9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d": "0x2121ae366fc6daf8a79c5420153e16a31b4c6a485666c11ef4ab20dcedfc1904",
|
|
||||||
"f3b50961ff387a3d68217e2715637d0add6013e7ecb83c36ae8062f97c46929e": "0xb6dfe8dd1f13f5db49e93909e8151cda0b3eb873950522e2c6dd9409057eea03",
|
|
||||||
"fd0690232b0fae5efdc402c1b9aac74176383ff7daf87d021554bda24a38e0ec": "0x397baeff4f1ad933330bff0101898d7dd376d33467bfee1fe4c8a13b6930c669",
|
|
||||||
"c719eb7bab9b2bc060167f1d1680eb34a29c490919072513b545b9785b73ee90": "0x6a2caf39dec7db0ca51e6cf1462756efc7b3637490920c3d111cd3d7da46a6e9",
|
|
||||||
"e799f456b358a2534aa1b45141d454ac04b444ed23b1440b778549bb758f2b5c": "0x5e0b5d2f55fe8ea36709508a4741219a009e32273daa8c43278a89b4c67112e4",
|
|
||||||
"9fb0bd29fe51481b61df41e650346cc374b13c2bab2e3610364cd834a592025a": "0xe2f01b5ad1edec664d3d646a708b26f85adde915999d56b2f15c0076a140cbd1",
|
|
||||||
"ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8": "0x8274e4be99bf8117209b4cdcc963fc397b868f360d20ecf15233591a84da752c",
|
|
||||||
"9c479b12a2b2c1051715d4d462dd7a6abbb6dccabf3af31a53f6130a1cd88efc": "0x0e8d64923791a322a31ccc8a8c7e1da47622c776414cc2a57c73795dcdad7b88",
|
|
||||||
"43cddc3e1d0b17fec1cf2a230f46e9319887a037dcee56e053af44d8259fb042": "0x3f0a05354694d442310e2acba79deb48621a7ca32c170d5bc068fd85dbec760e",
|
|
||||||
"0b46c1c04e9c914037cc4e0561a7e6787f6db0b89b7b65281f0f6fea1ce45a74": "0x3a552d9bcc7dbb8f9bb088f9fc81163a27aae54b79de7192a2ee88803a2c4598",
|
|
||||||
"396a969a9c1480fa15ed50bc59149e2c0075a72fe8f458ed941ddec48bdb4918": "0x262feca09bba056ee9b05c8d0e438c11862533bdabd42f8e79e37a03e994031e",
|
|
||||||
"26d53c97247ec18d576bbd23f88078acc22b42168dcb1d29a76501a956e26bad": "0x35988ff2b50960965250ccfc4a1be70ffa1a327e0cacfb7618db155d5a93d95f",
|
|
||||||
"d1d95644ffc11ca502f21e067a7814144c56b37018515ced4335a886a827a305": "0xf21863beeed8d8213ad163a37547ca404879875838cefd773f45966140e03536",
|
|
||||||
"a0255134973f4fdf2f8f7808354274a3b1ebc6ee438be898d045e8b56ba1fe13": "0x94538413241766c917b5837bc66a2f07201f9df610e985bc70f6f1a65bc8b824",
|
|
||||||
"e6ccd3f878cf338e6732bf59f60943e8ca2c28402fc4d9c258503b2edbe74a31": "0xe477c82786dd5186a36ada1d0092522bc04422a133bee0882cbffebee74bdfaf",
|
|
||||||
"3b7ef6c95ceedbffbb66bff3d6135a200c5d0a0466b0c90812510ceaedebaf04": "0x83e3bcf94d15dd8246f343a0c3a25b531da1882a237e65d0e3afa8ccc29c2b53",
|
|
||||||
"a4702f0f5818258783a1e47f453cb20b0fbec32ca67260e1d19dfcdd6a4d0ebb": "0xa6f4d72ebb3d8d3b847f560c0e1b9b53be59c61cb17905efcb78d9e59097eb61",
|
|
||||||
"3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5": "0x2a2acf181c73055bfbce46e0bd01ffbb73b4481fee51d1442dd0fcfca7011ee1",
|
|
||||||
"05380f8817eb1316c0b35ac19c3caa92c9aa9ea6be1555986c46dce97fed6afd": "0x415149af9fd9d712a5c543d203f5e7a4647232c93291b51cc77dda27591acdf3",
|
|
||||||
"78a3e3b8e676a8f73c439f5d749737034b139bbbe899ba5775216fba596607fe": "0x3d537759f6eb0f5d8a0894ab553553e70c7526f15c026641ab457d6e600dd488",
|
|
||||||
"b7e3904c08ddd9c0c10c6d207d390fd19e87eb6aab96304f571ed94caebdefa0": "0xf8bb072d7779c1f9eab2b5de52a0c7db7603cfc9076151bb5a2ba1ca2ed385b0",
|
|
||||||
"b5d0e0fa58a1f8b81498ae670ce93c872d14434b72c364885d4fa1b257cbb07a": "0xede216a9f98d06bf4ebab1a696ae992590605bf9bbaf05f742b96ab5d6ba0426",
|
|
||||||
"a639c04942ebfdeabf25bf1b88d6608ef387219748d77ea130bc2fa486b9614f": "0xdc7f9dbd88b507e36df3737e44106b8594b75eb4324412e960d113f5f61e2f55",
|
|
||||||
"2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f": "0xb148065aef7a6902b5a56404db8dc728253cc3562d6a0c274de4d4db91746cd7",
|
|
||||||
"bd640cddb72063e2ede34c6a0baf6699759b9837fcb06aa0e2fbcecb9b65fde7": "0xd3261ba9e558eda4056861879ede295549b416c75f3b756ca59145552b43ed03",
|
|
||||||
"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43": "0xa6241689d50ea973e4e0efa11e64f05d85255e18610bd094c6ee95efc2f670b7",
|
|
||||||
"5967c196ca33171a0b2d140ddc6334b998dd71c2ddd85ba7920c35fd6ed20fe9": "0xc9552aff3ed695958e7279ac930e5f4062fb3d9e0831c5fdcf1564019d2581b2",
|
|
||||||
"c9e9d228f565c226dfb8ed5f5c9c4f57ab32b7ade7226c3239ff20911a9c3a7b": "0x1df777cf70c4741367735002de6dbbed06346194749d9825b8578587a139f964",
|
|
||||||
"d0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ded4d1": "0x57bd3abe704df070c95bd142463c919f7eb8aab851f56a437429d40a2bcc5c04",
|
|
||||||
"1ce9069708fb49e2f1b062fa4f1be0bb151475ca506939d6d8c14386d49f43dc": "0x44b2efb1ffc530ee28b53ad75aba15d03beeac3d3ac00ab456a95e72b6e46e28",
|
|
||||||
"6d881ecf489bb24aa10468ca332e3ea262a9bf3a8fb9db1eadac9cce544b16b1": "0xfaa34d98d5776b63a0aa707cac04e3906a769c7b9822181e5831c3fdbe3852bc",
|
|
||||||
"b881c6dad5dd3dc9a83222f8032fb439859288119afc742d43adc305cef151cc": "0xec8b5dc385c72e1925585a8809df24b1797663b362d7ee698e94c244d95c4502",
|
|
||||||
"107918baaaafb79cd9df1c8369e44ac21136d95f3ca33f2373b78f24ba1e3e6a": "0xdd9518d23f6500d095760fe27b6be884cb729141828840501c745fbbb4077ac1",
|
|
||||||
"6ed3c7c4427ae2f91707495fc5a891b30795d93dbb3931782ddd77a5d8cb6db7": "0x2ad5bca64988a60eb6c015984d86f896d7780f89ba4e17d239a8d18dd0ff3c62",
|
|
||||||
"ed5c2a2711e2a638573add9a8aded37028aea4ac69f1431a1ced9d9db61b2225": "0xb1ce5c0bc015130411f74c52c69b17b34778beda878cf35582f4db10e1b37798",
|
|
||||||
"70ab610e3ed6642875f4a259dc29175452733316fee440f23fed99154d1d84f7": "0xf159bc6a781614afd84e7452a57afcea4b02c2a1d89e2af4b345d5704648274f",
|
|
||||||
"92eea8ba1b00078cdc2ef6f64f091f262e8c7d0576ee4677572f314ebfafa4c7": "0x17d6e86db99e31eec29b25faf06888bbb0cc5f5bad64d462c36c095384236eb8",
|
|
||||||
"c81114e16ec3cbcdf20197ac974aed5a254b941773971260ce09e7caebd6af46": "0x1f81a0a54c5acf8c6849d3555566ae3bcc078fac98ac44d95a248579e00254a6",
|
|
||||||
"d3178156b7c0f6ce10d6da7d347952a672467b51708baaf1a57ffe1fb005824a": "0x0c51789af2ef3a02c1a8dd4a5e90898ae4ab495909a0dec337d2adbf641f9e14",
|
|
||||||
"8ccb376aa871517e807358d4e3cf0bc7fe4950474dbe6c9ffc21ef64e43fc676": "0xc1ee9666521d2494288b3a4264e7428c4be31fbfd0412b7d3e480fa66cb7868e",
|
|
||||||
"701223c92a39dbab065c4a7997fef9c41c8de26ca2bf1f808ce0a4ea1cfd421f": "0x1e56055aa5510e42a522ac0d45baadeec54cb1ab4f80ed05fbcb01d6a63fe709",
|
|
||||||
"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a": "0x6c9fce723d522ec708cd4ff6d363277b03fe48fafee79e2b53ce7dfd95838f72",
|
|
||||||
"4456d442a152fd1f972b18459263ef467d3c29fb9d667e30c463b086691fbc79": "0x1d8e49343d812229fba1f2e7f04a6162224a566681d781c71b792fdc1b08947c",
|
|
||||||
"5b70af49d639eefe11f20df47a0c0760123291bb5bc55053faf797d1ff905983": "0xce84576e03736d879f77af0652b62185234af2ccc4e2e21e276813fa0ca47dbd",
|
|
||||||
"5c2416ad4b5fe25c38ea2078927d59dad6a1d4110480c0c96c9b4421744f7507": "0x30a78a430a10cae0d78913036d460eef5c6085c46f8ecf1ad7ba8dee76a12527",
|
|
||||||
"6d0af467543fc7daedf7abed96423877560c8d03725f3e5c87516774982a679c": "0xf261698164fef1649da47f846c6677648f524bc880b257fc771dd65ac540487d",
|
|
||||||
"abe4f2b264560a397f38eec024369356e5c1ea4f7aab94729369f144b3d97779": "0xedbc661a883e5f47ea5fa4bf5a06374fb60827e5e0e2ac413a96187e3f39a1e3",
|
|
||||||
"2fb245b9a84554a0f15aa123cbb5f64cd263b59e9a87d80148cbffab50c69f30": "0x65dfab50959d4f7a0e4bec441a6e0422d4dfcd0e23921c0069e35cc59cad38aa",
|
|
||||||
"19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5": "0x511286c4c9ce19b57a4ec47efd46f4a336175d36659a5b2741e611205b184853",
|
|
||||||
"327ae981719058e6fb44e132fb4adbf1bd5978b43db0661bfdaefd9bea0c82dc": "0x6ed3ddec8444bee9863077d70a0e8ca506242de914f1b3b581c88aecfa67bae3",
|
|
||||||
"46b8cc9347f04391764a0361e0b17c3ba394b001e7c304f7650f6376e37c321d": "0x7e1303e5cfb944c6b0d95e5f9fab038b305c8d80054394e24d8bf64b34b8553a",
|
|
||||||
"ccca1d2b0d9a9ca72aa2c849329520a378aea0ec7ef14497e67da4050d6cf578": "0x57f5289b1bb4008c2090b3e7401e8abdfdfb1bc5b6a4d649752bd537ddc04722",
|
|
||||||
"236b30dd09a9c00dfeec156c7b1efd646c0f01825a1758e3e4a0679e3bdff179": "0x2eb3509bf33b5e29124d61b4affc78b271c5b13aa60d4be9ec1d659ff41eaaff",
|
|
||||||
"2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d": "0x9a6d328a6ebd906ed842e6e874e14bea69efa1c421fbfe7f689c33412a43c41c",
|
|
||||||
"ef94acc2fb09eb976c6eb3000bab898cab891d5b800702cd1dc88e61d7c3c5e6": "0x97faf2540a0b1ddff6e7f25bbfc7067eecad0334524a70e1caffdc519e2098d3",
|
|
||||||
"37505261e557e251290b8c8899453064e8d760ed5c65a779726f2490980da74c": "0x9e743ce40f1f5cad26d7b9a83dd1b7750d9637f13edcfa95ec45ffaaac81cf4d",
|
|
||||||
"5bc91f13e412c07599167bae86f07543f076a638962b8d6017ec19dab4a82814": "0x794047e361d3837b84a3941bb8fee704e083433404e68e20e6d54dbb5673cad5",
|
|
||||||
"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419": "0xec956a3c13b3db5c34acc7a19b2d655886c25483254065c7f770ebe64c71b3a2",
|
|
||||||
"97d7d4c20e5a06fdb60f7a448a9e9a779f2b31c3f21121180010a4a470844aae": "0x6928f835a904ad05c54fc1eb9d1269d5396e62eac58cf53f7967dfe54c2e8ced",
|
|
||||||
"c572690504b42b57a3f7aed6bd4aae08cbeeebdadcf130646a692fe73ec1e009": "0xf680a00084f0e61980327af92d5bd5f5eead25d5ad392c18669fe9db72ab1de8",
|
|
||||||
"735f591e4fed988cd38df74d8fcedecf2fe8d9111664e0fd500db9aa78b316b1": "0x7b86aa064d0d8c77685fe76955f83ecc2c63d06bbdf5ee21273e6866243653f9",
|
|
||||||
"8e860fb74e60e5736b455d82f60b3728049c348e94961add5f961b02fdee2535": "0x2746e22f8f134808ba8332294d5687b975c8dbabca51f5e773483a8b5c006de9",
|
|
||||||
"48ce0cf436bac22dad33551dfe2eb7bf9991e419a05f25aed4e90c29c3a1cdbe": "0xd698c1ab8cecb252cd6c05371b19885d7f3937ababd26250745bb1d9fa6ee019",
|
|
||||||
"fd05a384ba19863cbdfc6575bed584f041ef50554bab3ab482eabe4ea58d9f81": "0x70e632d62a24202debf5e4099010c5c360b26f8ce9bcfbd49d52789a3c45a9c5",
|
|
||||||
"5867f5683c757393a0670ef0f701490950fe93fdb006d181c8265a831ac0c5c6": "0xb5469f185e5a69f8591b4cc9d326eae8fddb86df381408d8ea428ad1001231b3",
|
|
||||||
"3b4656b0d92f0e995024c3dacfc28c47d11af83b374a56c26e514e9a7e46a240": "0x6acb3837b8b069d5af140c6ec99358c862d9af443aa87ca8dbdecdc4963dc83e",
|
|
||||||
"235ddea9f40e9af5814dbcc83a418b98e3ee8df1e34e1ae4d45cf5de596023a3": "0x43c1205fc3af779d6b9719327d60bc4cf61a2509264defcd7cbc104e731cf461",
|
|
||||||
"956740a4e169e90bb141abfe93652ae3434693bc7ca43cbcea6471408f19ab90": "0x104ef1548854fd68403152a4661360a484e116c8926d5435325684339e7a4792",
|
|
||||||
"89a58e1cab821118133d6831f5018fba5b354afb78b2d18f575b3cbf69a4f652": "0x81879f4a1e9a6115d6a8f1cb02a13cd6bf9e2713ccd4518c39290ab0aab855bf",
|
|
||||||
"e0f87bbde799f33615b83a601b66415e850788000cd7286a3e7295f23c1bb353": "0x4e960abf91b2868b8f7003d4c788f2971f17fdd673c552d8c6c7abdbcf1264f3",
|
|
||||||
"15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864": "0x3b2e581f72613f5ca5845ecd97fa54133c4ef2edb41d4cee048050ae61352891",
|
|
||||||
"d57d90cd8554ea0cf8268de30d5ad67fed9a8f11cce5132a49eb687aed832ea6": "0xf7aa8fb0db1de5d2e102c3bac7c4b664c7c4f190100681e826d93784c76126f5",
|
|
||||||
"301377b122716cee1a498e7930a1836c0b1db84667cc78bbbcbad6c330ea6afb": "0x838e80e58c62e04a7420ff13e450b65df38095aa51471975742b89a6c23e2e0a",
|
|
||||||
"6034b1f68b9363dff2cf9d53b1a88fb4d0929c65f34d532db53738853efc00ad": "0xe42b1d1c8ee5efd399068416bf77f3f194e29a94406acc88a90dd8029bb706aa",
|
|
||||||
"c19405e4c8bdcbf2a66c37ae05a27d385c8309e9d648ed20dc6ee717e7d30e17": "0xf5a4f393712a9dc7164f0decbf90af2594a4a7199ea0d380c8e4f265ca7ddd59",
|
|
||||||
"10946973bfcc936b423d52ee2c5a538d96427626fe6d1a7dae14b1c401d1e794": "0xc15d506b720e9e47f1ab76510eb0d8d93f1a8331a0edb71d30fe2a862693e607",
|
|
||||||
"f464e36fd4ef2f1c3dc30801a9ab470dcdaaa0af14dd3cf6ae17a7fca9e051c5": "0x858a716e3b2e9e71be3120de427ebf5ec1b461721645c245f948274f13f87c33",
|
|
||||||
"3dd2b63686a450ec7290df3a1e0b583c0481f651351edfa7636f39aed55cf8a3": "0x3736ba57e9fa1f82ba9dcdb63142c2871ab6664ec6d2bae0e185feb698b16211",
|
|
||||||
"c8acad81438490d4ebcac23b3e93f31cdbcb893fcba746ea1c66b89684faae2f": "0xe3e1904ab43bab2a002c7cbfe2a25087211a92f163eb4f8f5ea89905fc0232e2",
|
|
||||||
"6aac625e125ada0d2a6b98316493256ca733a5808cd34ccef79b0e28c64d1e76": "0x300a46a6b7c9574270a6a261b1fe09765b1d186991b5a7f054b2fb6b89980310",
|
|
||||||
"a995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b": "0xa9f457c3e8f90ce4147a5368ac7d1bad29fc3e7a7b566e9da8caea80e70f9015",
|
|
||||||
"a5eb88d3ea93f6240d7e54b4466bc1857f7bfc1658d49a07f68096ebc0fdde3b": "0xf23a24daea2a46388337064f8e466bdc9b848414b246769da8dc756cd19ed352",
|
|
||||||
"e1d3115c6e7ac649faca875b3102f1000ab5e06b03f6903e0d699f0f5315ba86": "0xda049b4223747412a535f4b007166fbf1b6d7de42f9f49ddf8453d5312a3e66b",
|
|
||||||
"c80657b7f6f3eac27218d09d5a4e54e47b25768d9f5e10ac15fe2cf900881400": "0xc840d2761d833abbc469ae1140d1eb5827d2cd2d1bf70520fa1281debdf99926",
|
|
||||||
"23199c2bcb1303f667e733b9934db9eca5991e765b45f5ed18bc4b231415f2fe": "0x2d7aa5836ae880f2bd9b1b14d18abef42b5cc8116b332c368457555899fdf184",
|
|
||||||
"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b": "0xcc7b6d3a8fc8b32878e333578ab57e96a7ef8ec4498bcc6e839c362924ea52d3",
|
|
||||||
"2f2d17abbc1e781bd87b4a5d52c8b2856886f5c482fa3593cebf6795040ab0b6": "0xd79ce52a240701df5add9d5f325ab0222271e8ff70e36150426546470bdfd3bc",
|
|
||||||
"45b05d03edb6081e7ae536b94b450a42f43e6342791c560a481030b41f9b945d": "0x0950d9b3f34603308ac7583d791fff9e2b9627dbbf9490f5dd7dd67410a6093f",
|
|
||||||
"c7b72e5d860034288c9335d4d325da4272fe50c92ab72249d58f6cbba30e4c44": "0x7438e09365085c82eabdf045069e749fb95b4e7d39c1ac56fa74c1f5e62500c4",
|
|
||||||
"eef52e09c878ad41f6a81803e3640fe04dceea727de894edd4ea117e2e332e66": "0x21a473555224392259558994ae30f93250f305fa14569e452539df785576b629",
|
|
||||||
"1888f463c27997174f97d2a36af29bf4648b61a5f69e67c45505a80f826bb785": "0x70c306983d152a50905f7561c77ee48938deeb794beaef341bb294c2bb5aa996",
|
|
||||||
"2077043ee3b67b9a70949c8396c110f6cf43de8e6d9e6efdcbd557a152cf2c6e": "0x09ecce08348f4ae9b6f3ac6fac862e441ed9876e33212694c0a4d6639a797c3f",
|
|
||||||
"23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744": "0x5854ab7960bb36c34701a6509fd85eed4b505cf15fc68a2e6c297361c0847d50",
|
|
||||||
"c1751e085ee292b8b3b9dd122a135614485a201c35dfc653553f0e28c1baf3ff": "0x359325eddf76b5a758697c7be661653a0cec39c51214da8e5a7155b6877753fe",
|
|
||||||
"7a5bc1d2b56ad029048cd63964b3ad2776eadf812edc1a43a31406cb54bff592": "0xfb993017bb92a8e2868d6d52b486aea8013dcd9bca8fd557306ee48bdfacbecb",
|
|
||||||
"63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3": "0x1d0afcbaf07da5e4eb570df8b551b24ecfc889c54036de1f31a27bd15a9268d1",
|
|
||||||
"67a6f93030420c1c9e3fe37c1ab6b77966af82f995944a9fefce357a22854a80": "0x51ca0aacdd00a18ce65eb4614b17c7a50b05861841dcb6b652936463527f38dd",
|
|
||||||
"9ff7b9a93df40f6d7edc8184173c50f4ae72152c6142f001e8202a26f951d710": "0x374088f90087c668259444d8b4118937cc5b296f2b9f3b9a2435c019fca6c4de",
|
|
||||||
"765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2": "0x7a410b6e800f2e2a15b5027b90e855b8cd0954fbb22dd245c4a884a6603f3e55",
|
|
||||||
"8419416ba640c8bbbcf2d464561ed7dd860db1e38e51cec9baf1e34c4be839ae": "0x0d0f6fdadb7b2dcd0b4130e44d20195c4b13caeaa1f65c38249c330b4c1307d2",
|
|
||||||
"0b1e3297e69f162877b577b0d6a47a0d63b2392bc8499e6540da4187a63e28f8": "0x00330abb569ac93d08b902bbd9e4c69041511417d3c88450b7291f99422c1587",
|
|
||||||
"ef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52": "0xf2a08b0909acde30ef72a7291cda5314b76e544136d83ceb0339fa2c1221aed5",
|
|
||||||
"b0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd": "0x1c15c9326be25b19496c25ee66545bfd8151c573a49c6a9075d0a5a98e4f7981",
|
|
||||||
"49601625e1a342c1f90c3fe6a03ae0251991a1d76e480d2741524c29037be28a": "0x540988b6594c264ac5fced6a9021e98b3a3c6764e6f9d1112536c6d2445dbc63",
|
|
||||||
"9095653620547ece988ec51486dc7a6eb2efddbce8ea5bedbd53bf00cca84cf6": "0xa351d146407bd613cb443031d474c0639f3a328af429866b38d094caa21a44a0",
|
|
||||||
"3f4b77dd904e849f70e1e812b7811de57202b49bc47c56391275c0f45f2ec481": "0x2fc81e546084af17b8d99788f4d05254499de49fa2065d79950f19355e23c781",
|
|
||||||
"2394ce86c7d68050ce52797923860f6c1656a73fb11bd10dacb3f9c719acdd1d": "0xc2d8c65d82ab5413d81ef44e28833be0dd286376ea47e02b26400a67f34c579e",
|
|
||||||
"b82449fd728133488d2d41131cffe763f9c1693b73c544d9ef6aaa371060dd25": "0x0624b35d4b654877cf5331f3865b28a8e872efbe40cd877a5470a1e4509107cc",
|
|
||||||
"59671f59d12dc81bae078754b7469c7434528a66d3fa91193cf204460c198f9b": "0xc4209783660db421a861200b7164aacd682ca5bc2a53dcd40c9235b78245a0c0",
|
|
||||||
"fa17ceaf30d19ba51112fdcc750cc83454776f47fb0112e4af07f15f4bb1ebc0": "0xa8539d032e6aba8837568af71ddfe4494139ba37e2ccba5df3a6cb0b5d157c60",
|
|
||||||
"7507a4629ad0143550666bce2e7cae0b961a0f624f821feaab642fe1be632f5c": "0xcd40ec7af217643b816992906439d9c638e4b97203bebc5a4ceb5eed92f5f82f",
|
|
||||||
"fee33f2a978bf32dd6b662b65ba8083c6773b494f8401194ec1870c640860245": "0x8c1fd6c6d4e328f4ac2d47d67bde6223d9ba3b1ab9d2d2d819462bb8a39d9079",
|
|
||||||
"20d096e088a9b85f8cf09278965b77aeb05c00769e2ddeda5ea2d07ea554b283": "0x16f6f47720607a364c0df4718d78810d5ed8ec5ecac4c18380d6acef614a08e9"
|
|
||||||
}
|
|
|
@ -1,118 +0,0 @@
|
||||||
/// We build a programmable txn to create all price feeds.
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
import axios from "axios";
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
import * as _ from "lodash";
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// ================== Network dependent settings ==================
|
|
||||||
let network = NETWORK.MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
const price_feed_id_url = "https://xc-mainnet.pyth.network/api/price_feed_ids"; // <= NOTE: Update this when changing network
|
|
||||||
const connection = new PriceServiceConnection(
|
|
||||||
"https://xc-mainnet.pyth.network", // <= NOTE: Update this when changing network
|
|
||||||
{
|
|
||||||
priceFeedRequestConfig: {
|
|
||||||
binary: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
// ================================================================
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("Wallet key unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log("wallet address: ", wallet.getAddress());
|
|
||||||
|
|
||||||
// Fetch all price IDs
|
|
||||||
let { data } = await axios.get(price_feed_id_url);
|
|
||||||
const price_feed_ids = data;
|
|
||||||
console.log("num price feed ids: ", price_feed_ids.length);
|
|
||||||
|
|
||||||
// Create price feeds 20 at a time
|
|
||||||
for (let chunk of _.chunk(price_feed_ids, 20)) {
|
|
||||||
//@ts-ignore
|
|
||||||
const priceFeedVAAs = await connection.getLatestVaas(chunk);
|
|
||||||
console.log("price feed VAAs len: ", priceFeedVAAs.length);
|
|
||||||
console.log("sample vaa: ", priceFeedVAAs[0]);
|
|
||||||
await create_price_feeds(wallet, registry, priceFeedVAAs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function create_price_feeds(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
priceFeedVAAs: Array<string>
|
|
||||||
) {
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
console.log("SUI_CLOCK_OBJECT_ID: ", SUI_CLOCK_OBJECT_ID);
|
|
||||||
|
|
||||||
for (let vaa of priceFeedVAAs) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...Buffer.from(vaa, "base64")]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::create_price_feeds`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${WORM_PACKAGE}::vaa::VAA`,
|
|
||||||
objects: [verified_vaa],
|
|
||||||
}),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,99 +0,0 @@
|
||||||
/// We build a programmable txn to create a price feed.
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// ================== Network dependent settings ==================
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_BASE_64; // <= NOTE: Update this when changing network
|
|
||||||
// ================================================================
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(
|
|
||||||
network == "MAINNET"
|
|
||||||
? Buffer.from(walletPrivateKey, "hex")
|
|
||||||
: Buffer.from(walletPrivateKey, "base64").subarray(1)
|
|
||||||
),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log(wallet.getAddress());
|
|
||||||
const vaa_bytes =
|
|
||||||
"AQAAAAABAMN885gNTVEako6fczJq22AOFSRWdUsUOxPQVHSnxhj3ecU2gJVDBlAcY6G9FWmGCcGcdZ/5iVXQCm+0loHvfqwAZE/kXQAAAAAAGqJ4OdZBsHdDwMtfaMUfjNMdLAdivsANxvzSVDPvGrW2AAAAAADugxEBUDJXSAADAAEAAQIABQCdWnl7akEQMaEEfYaw/fhuJFW+jn/vFq7yPbIJcj2vlB9hIm05vuoZ0zTxfC/rzifhJkbYRnWSTrsCuc2upocn4wAAAABBxD4gAAAAAAAJ2WD////4AAAAAEIrzm4AAAAAAAn/ewEAAAABAAAAAgAAAABkT+RdAAAAAGRP5F0AAAAAZE/kXAAAAABBxC0/AAAAAAAJi/EAAAAAZE/kXLWIXWbTUV6YNI7DMlk7XRbg/bhT77Ye1dzAvPgOkWCB11ZqO6f3KG7VT0rn6YP0QgrgseDziS4R+cSrEHu617kAAAAAZCplIAAAAAAAEu4I////+AAAAABkvzOKAAAAAAAQZDgBAAAAAQAAAAIAAAAAZE/kXQAAAABkT+RdAAAAAGRP5FwAAAAAZCplIAAAAAAAFIotAAAAAGRP5Fw3+21L/xkSgKfP+Av17aeofBUakdmoW6So+OLPlX5BjbMn2c8OzXk6F1+nCsjS3BCdRGJ1jlVpYsSoewLsTz8VAAAAAC1gXb0AAAAAAAdkLv////gAAAAALZa00gAAAAAABpwgAQAAAAEAAAACAAAAAGRP5F0AAAAAZE/kXQAAAABkT+RcAAAAAC1gXb0AAAAAAAdkLgAAAABkT+RcHNsaXh40VtKXfuDT1wdlI58IpChVuVCP1HnhXG3E0f7s9VN3DZsQll+Ptkdx6T9WkKGC7cMr5KMjbgyqpuBYGgAAAAewLri2AAAAAAEnq0n////4AAAAB7uEHmgAAAAAAV8hnAEAAAABAAAAAgAAAABkT+RdAAAAAGRP5F0AAAAAZE/kXAAAAAewBz2PAAAAAAE4kisAAAAAZE/kXGogZxwOP4yyGc4/RuWuCWpPL9+TbSvU2okl9wCH1R3YMAKUeVmHlykONjihcSwpveI2fQ7KeU93iyW1pHLxkt4AAAACtJQuKQAAAAAAn4lX////+AAAAAK3aIHUAAAAAACmrg4BAAAAAQAAAAIAAAAAZE/kXQAAAABkT+RdAAAAAGRP5FwAAAACtJOhZQAAAAAAnAlPAAAAAGRP5Fw=";
|
|
||||||
create_price_feeds(wallet, registry, vaa_bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function create_price_feeds(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
vaa_bytes: string
|
|
||||||
) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
console.log("SUI_CLOCK_OBJECT_ID: ", SUI_CLOCK_OBJECT_ID);
|
|
||||||
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...Buffer.from(vaa_bytes, "base64")]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::create_price_feeds`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${WORM_PACKAGE}::vaa::VAA`,
|
|
||||||
objects: [verified_vaa],
|
|
||||||
}), // has type vector<VAA>,
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,100 +0,0 @@
|
||||||
/// Deploy Pyth to Sui testnet (devnet deploy can be done via CLI)
|
|
||||||
import {
|
|
||||||
fromB64,
|
|
||||||
getPublishedObjectChanges,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// ================== Network dependent settings ==================
|
|
||||||
let network = NETWORK.MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
// ================================================================
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("Wallet unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
await publishPackage(wallet, "../contracts");
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function publishPackage(signer: RawSigner, packagePath: string) {
|
|
||||||
try {
|
|
||||||
// Build contracts
|
|
||||||
const buildOutput: {
|
|
||||||
modules: string[];
|
|
||||||
dependencies: string[];
|
|
||||||
} = JSON.parse(
|
|
||||||
execSync(
|
|
||||||
`sui move build --dump-bytecode-as-base64 --path ${packagePath} 2> /dev/null`,
|
|
||||||
{
|
|
||||||
encoding: "utf-8",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("buildOutput: ", buildOutput);
|
|
||||||
|
|
||||||
// Publish contracts
|
|
||||||
const transactionBlock = new TransactionBlock();
|
|
||||||
|
|
||||||
transactionBlock.setGasBudget(4000000000);
|
|
||||||
|
|
||||||
const [upgradeCap] = transactionBlock.publish({
|
|
||||||
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
|
||||||
dependencies: buildOutput.dependencies.map((d: string) =>
|
|
||||||
normalizeSuiObjectId(d)
|
|
||||||
),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Transfer upgrade capability to deployer
|
|
||||||
transactionBlock.transferObjects(
|
|
||||||
[upgradeCap],
|
|
||||||
transactionBlock.pure(await signer.getAddress())
|
|
||||||
);
|
|
||||||
|
|
||||||
// Execute transactions
|
|
||||||
const res = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const publishEvents = getPublishedObjectChanges(res);
|
|
||||||
if (publishEvents.length !== 1) {
|
|
||||||
throw new Error(
|
|
||||||
"No publish event found in transaction:" +
|
|
||||||
JSON.stringify(res.objectChanges, null, 2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
import { Connection, JsonRpcProvider } from "@mysten/sui.js";
|
|
||||||
|
|
||||||
// ================== Network dependent settings ==================
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: "https://fullnode.testnet.sui.io:443" }) // <= NOTE: Update this when changing network
|
|
||||||
);
|
|
||||||
const objectId =
|
|
||||||
"0xa17b30c3d280de33ef50bdd23219a037108a8ccb1ad74f334fcbb7d64eb57647"; // <= NOTE: Update this when changing network AND with new deployment
|
|
||||||
// ================================================================
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
// Table of Sui Pyth PriceIdentifier => Price Info Object IDs
|
|
||||||
|
|
||||||
let nextCursor;
|
|
||||||
let hasNextPage = false;
|
|
||||||
let map = new Map<string, string>();
|
|
||||||
do {
|
|
||||||
const dynamic_fields = await provider.getDynamicFields({
|
|
||||||
parentId: objectId,
|
|
||||||
cursor: nextCursor,
|
|
||||||
});
|
|
||||||
console.log(dynamic_fields);
|
|
||||||
|
|
||||||
let promises = await Promise.all(
|
|
||||||
dynamic_fields.data.map((x) =>
|
|
||||||
provider.getObject({ id: x.objectId, options: { showContent: true } })
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
//@ts-ignore
|
|
||||||
let get_key = (x) =>
|
|
||||||
Buffer.from(x.data.content.fields.name.fields.bytes).toString("hex");
|
|
||||||
let get_value = (x) => x.data.content.fields.value;
|
|
||||||
let key_value_pairs = promises.map((x) => [get_key(x), get_value(x)]);
|
|
||||||
console.log("key value pairs: ", key_value_pairs);
|
|
||||||
for (let x of key_value_pairs) {
|
|
||||||
console.log("entry in key value pairs: ", x);
|
|
||||||
map.set(x[0], x[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// pagination
|
|
||||||
nextCursor = dynamic_fields.nextCursor;
|
|
||||||
hasNextPage = dynamic_fields.hasNextPage;
|
|
||||||
|
|
||||||
// Sleep to not hit rate limit.
|
|
||||||
console.log("Going to sleep for 10 seconds...");
|
|
||||||
await new Promise((f) => setTimeout(f, 10000));
|
|
||||||
} while (hasNextPage);
|
|
||||||
|
|
||||||
console.log("map size: ", map.size);
|
|
||||||
console.log("map is: ", map);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
|
@ -1,31 +0,0 @@
|
||||||
/// Fetch price feed VAAs of interest from the Pyth
|
|
||||||
/// price feed service.
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const connection = new PriceServiceConnection(
|
|
||||||
"https://xc-mainnet.pyth.network",
|
|
||||||
{
|
|
||||||
priceFeedRequestConfig: {
|
|
||||||
binary: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Fetch all price IDs
|
|
||||||
//let {data} = await axios.get("https://xc-mainnet.pyth.network/api/price_feed_ids")
|
|
||||||
//console.log("number of all price feed ids: ", data.length)
|
|
||||||
|
|
||||||
let data = [
|
|
||||||
"0x63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3",
|
|
||||||
//"0x8b62866fcd3a25ff9118506444e9fe5171e67c61a049f4b4fdacdbc31ae862bb", // testnet
|
|
||||||
//"0x0e60a64dcbd660e87a08eb2cc95e8d84d1126fd7354d377b3fc5730352f4b8b2", // testnet
|
|
||||||
//"0x651071f8c7ab2321b6bdd3bc79b94a50841a92a6e065f9e3b8b9926a8fb5a5d1", // testnet
|
|
||||||
];
|
|
||||||
const priceFeedVAAs = await connection.getLatestVaas(data);
|
|
||||||
//console.log("number of VAAs: ", priceFeedVAAs.length)
|
|
||||||
console.log(Buffer.from(priceFeedVAAs[0], "base64").toString("hex"));
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
|
@ -1,106 +0,0 @@
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK, INITIAL_DATA_SOURCES } from "../registry";
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// ================== Network dependent settings ==================
|
|
||||||
let network = NETWORK.MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
let walletPrivateKey = process.env.SUI_MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
// ================================================================
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const initial_data_sources = INITIAL_DATA_SOURCES[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("Wallet key unset in environment");
|
|
||||||
}
|
|
||||||
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
|
|
||||||
const PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
|
|
||||||
// NOTE: Set these before calling init_pyth
|
|
||||||
const upgradeCap =
|
|
||||||
"0x82d5b1ab3bd40d121f1a9b073815f241ccd696edf324d2a386d38477f0834082";
|
|
||||||
const deployerCap =
|
|
||||||
"0x5bc07a9e7627534680313a2a0499cbbaa76c4b50db30eb86e85ae211c26fc911";
|
|
||||||
|
|
||||||
init_pyth(wallet, PYTH_PACKAGE, deployerCap, upgradeCap);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
/// Use a programmable transaction block to call
|
|
||||||
/// the Pyth pyth::pyth::init_pyth function.
|
|
||||||
async function init_pyth(
|
|
||||||
signer: RawSigner,
|
|
||||||
pythPackage: string,
|
|
||||||
deployerCap: string,
|
|
||||||
upgradeCap: string
|
|
||||||
) {
|
|
||||||
console.log("GOVERNANCE_CHAIN: ", initial_data_sources["GOVERNANCE_CHAIN"]);
|
|
||||||
console.log("GOVERNANCE_ADDRESS: ", [
|
|
||||||
...Buffer.from(initial_data_sources["GOVERNANCE_ADDRESS"], "hex"),
|
|
||||||
]);
|
|
||||||
console.log(
|
|
||||||
"DATA_SOURCE_CHAINS: ",
|
|
||||||
initial_data_sources["DATA_SOURCE_CHAINS"]
|
|
||||||
);
|
|
||||||
console.log(
|
|
||||||
"DATA_SOURCE_ADDRESSES: ",
|
|
||||||
initial_data_sources["DATA_SOURCE_ADDRESSES"].map((x) => [
|
|
||||||
...Buffer.from(x, "hex"),
|
|
||||||
])
|
|
||||||
);
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${pythPackage}::pyth::init_pyth`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(deployerCap),
|
|
||||||
tx.object(upgradeCap),
|
|
||||||
tx.pure(60), // stale price threshold
|
|
||||||
tx.pure(initial_data_sources["GOVERNANCE_CHAIN"]), // governance emitter chain id
|
|
||||||
tx.pure([
|
|
||||||
...Buffer.from(initial_data_sources["GOVERNANCE_ADDRESS"], "hex"),
|
|
||||||
]), // governance emitter chain address
|
|
||||||
tx.pure(initial_data_sources["DATA_SOURCE_CHAINS"]), // data source emitter chain ids
|
|
||||||
tx.pure(
|
|
||||||
initial_data_sources["DATA_SOURCE_ADDRESSES"].map((x) => [
|
|
||||||
...Buffer.from(x, "hex"),
|
|
||||||
])
|
|
||||||
), // data source addresses
|
|
||||||
tx.pure(1), // base update fee
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2_000_000_000n);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,128 +0,0 @@
|
||||||
/// We build a programmable txn to create all price feeds.
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
import axios from "axios";
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
const connection = new PriceServiceConnection(
|
|
||||||
"https://xc-testnet.pyth.network", // <= NOTE: Update this when changing network
|
|
||||||
{
|
|
||||||
priceFeedRequestConfig: {
|
|
||||||
binary: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_MAINNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log("wallet address: ", wallet.getAddress());
|
|
||||||
|
|
||||||
// Fetch all price IDs
|
|
||||||
let { data } = await axios.get(
|
|
||||||
"https://xc-testnet.pyth.network/api/price_feed_ids" // <= NOTE: Update this when changing network
|
|
||||||
);
|
|
||||||
const price_feed_ids = data;
|
|
||||||
console.log("num price feed ids: ", price_feed_ids.length);
|
|
||||||
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(0, 20));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(20, 40));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(40, 60));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(60, 80));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(80, 100));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(100, 120));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(120, 140));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(140, 160));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(160, 180));
|
|
||||||
//const priceFeedVAAs = await connection.getLatestVaas(price_feed_ids.slice(180, 200));
|
|
||||||
const priceFeedVAAs = await connection.getLatestVaas(
|
|
||||||
price_feed_ids.slice(200, 220)
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("price feed VAAs len: ", priceFeedVAAs.length);
|
|
||||||
|
|
||||||
create_price_feeds(wallet, registry, priceFeedVAAs);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function create_price_feeds(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
priceFeedVAAs: Array<string>
|
|
||||||
) {
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
console.log("SUI_CLOCK_OBJECT_ID: ", SUI_CLOCK_OBJECT_ID);
|
|
||||||
|
|
||||||
for (let vaa of priceFeedVAAs) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...Buffer.from(vaa, "base64")]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::create_price_feeds`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${WORM_PACKAGE}::vaa::VAA`,
|
|
||||||
objects: [verified_vaa],
|
|
||||||
}),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(1000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
/// We build a programmable txn to create a price feed.
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_BASE_64; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(
|
|
||||||
network == "MAINNET"
|
|
||||||
? Buffer.from(walletPrivateKey, "hex")
|
|
||||||
: Buffer.from(walletPrivateKey, "base64").subarray(1)
|
|
||||||
),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log(wallet.getAddress());
|
|
||||||
const vaa_bytes =
|
|
||||||
"AQAAAAABAMN885gNTVEako6fczJq22AOFSRWdUsUOxPQVHSnxhj3ecU2gJVDBlAcY6G9FWmGCcGcdZ/5iVXQCm+0loHvfqwAZE/kXQAAAAAAGqJ4OdZBsHdDwMtfaMUfjNMdLAdivsANxvzSVDPvGrW2AAAAAADugxEBUDJXSAADAAEAAQIABQCdWnl7akEQMaEEfYaw/fhuJFW+jn/vFq7yPbIJcj2vlB9hIm05vuoZ0zTxfC/rzifhJkbYRnWSTrsCuc2upocn4wAAAABBxD4gAAAAAAAJ2WD////4AAAAAEIrzm4AAAAAAAn/ewEAAAABAAAAAgAAAABkT+RdAAAAAGRP5F0AAAAAZE/kXAAAAABBxC0/AAAAAAAJi/EAAAAAZE/kXLWIXWbTUV6YNI7DMlk7XRbg/bhT77Ye1dzAvPgOkWCB11ZqO6f3KG7VT0rn6YP0QgrgseDziS4R+cSrEHu617kAAAAAZCplIAAAAAAAEu4I////+AAAAABkvzOKAAAAAAAQZDgBAAAAAQAAAAIAAAAAZE/kXQAAAABkT+RdAAAAAGRP5FwAAAAAZCplIAAAAAAAFIotAAAAAGRP5Fw3+21L/xkSgKfP+Av17aeofBUakdmoW6So+OLPlX5BjbMn2c8OzXk6F1+nCsjS3BCdRGJ1jlVpYsSoewLsTz8VAAAAAC1gXb0AAAAAAAdkLv////gAAAAALZa00gAAAAAABpwgAQAAAAEAAAACAAAAAGRP5F0AAAAAZE/kXQAAAABkT+RcAAAAAC1gXb0AAAAAAAdkLgAAAABkT+RcHNsaXh40VtKXfuDT1wdlI58IpChVuVCP1HnhXG3E0f7s9VN3DZsQll+Ptkdx6T9WkKGC7cMr5KMjbgyqpuBYGgAAAAewLri2AAAAAAEnq0n////4AAAAB7uEHmgAAAAAAV8hnAEAAAABAAAAAgAAAABkT+RdAAAAAGRP5F0AAAAAZE/kXAAAAAewBz2PAAAAAAE4kisAAAAAZE/kXGogZxwOP4yyGc4/RuWuCWpPL9+TbSvU2okl9wCH1R3YMAKUeVmHlykONjihcSwpveI2fQ7KeU93iyW1pHLxkt4AAAACtJQuKQAAAAAAn4lX////+AAAAAK3aIHUAAAAAACmrg4BAAAAAQAAAAIAAAAAZE/kXQAAAABkT+RdAAAAAGRP5FwAAAACtJOhZQAAAAAAnAlPAAAAAGRP5Fw=";
|
|
||||||
create_price_feeds(wallet, registry, vaa_bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function create_price_feeds(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
vaa_bytes: string
|
|
||||||
) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
console.log("SUI_CLOCK_OBJECT_ID: ", SUI_CLOCK_OBJECT_ID);
|
|
||||||
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...Buffer.from(vaa_bytes, "base64")]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::create_price_feeds`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${WORM_PACKAGE}::vaa::VAA`,
|
|
||||||
objects: [verified_vaa],
|
|
||||||
}), // has type vector<VAA>,
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,99 +0,0 @@
|
||||||
/// Deploy Pyth to Sui testnet (devnet deploy can be done via CLI)
|
|
||||||
import {
|
|
||||||
fromB64,
|
|
||||||
getPublishedObjectChanges,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_MAINNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
await publishPackage(wallet, "../../contracts");
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function publishPackage(signer: RawSigner, packagePath: string) {
|
|
||||||
try {
|
|
||||||
// Build contracts
|
|
||||||
const buildOutput: {
|
|
||||||
modules: string[];
|
|
||||||
dependencies: string[];
|
|
||||||
} = JSON.parse(
|
|
||||||
execSync(
|
|
||||||
`sui move build --dump-bytecode-as-base64 --path ${__dirname}/${packagePath} 2> /dev/null`,
|
|
||||||
{
|
|
||||||
encoding: "utf-8",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("buildOutput: ", buildOutput);
|
|
||||||
|
|
||||||
// Publish contracts
|
|
||||||
const transactionBlock = new TransactionBlock();
|
|
||||||
|
|
||||||
transactionBlock.setGasBudget(4000000000);
|
|
||||||
|
|
||||||
const [upgradeCap] = transactionBlock.publish({
|
|
||||||
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
|
||||||
dependencies: buildOutput.dependencies.map((d: string) =>
|
|
||||||
normalizeSuiObjectId(d)
|
|
||||||
),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Transfer upgrade capability to deployer
|
|
||||||
transactionBlock.transferObjects(
|
|
||||||
[upgradeCap],
|
|
||||||
transactionBlock.pure(await signer.getAddress())
|
|
||||||
);
|
|
||||||
|
|
||||||
// Execute transactions
|
|
||||||
const res = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const publishEvents = getPublishedObjectChanges(res);
|
|
||||||
if (publishEvents.length !== 1) {
|
|
||||||
throw new Error(
|
|
||||||
"No publish event found in transaction:" +
|
|
||||||
JSON.stringify(res.objectChanges, null, 2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
import { Connection, JsonRpcProvider, JsonRpcClient } from "@mysten/sui.js";
|
|
||||||
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: "https://fullnode.mainnet.sui.io:443" })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
// Table of Sui Pyth PriceIdentifier => Price Info Object IDs
|
|
||||||
const objectId =
|
|
||||||
"0xc4a7182984a662b159a18a8754dbc15e11048b42494b2c4ddcf1ec3bcc7004fe";
|
|
||||||
|
|
||||||
let nextCursor;
|
|
||||||
let hasNextPage = false;
|
|
||||||
let map = new Map<string, string>();
|
|
||||||
do {
|
|
||||||
const dynamic_fields = await provider.getDynamicFields({
|
|
||||||
parentId: objectId,
|
|
||||||
cursor: nextCursor,
|
|
||||||
});
|
|
||||||
console.log(dynamic_fields);
|
|
||||||
|
|
||||||
let promises = await Promise.all(
|
|
||||||
dynamic_fields.data.map((x) =>
|
|
||||||
provider.getObject({ id: x.objectId, options: { showContent: true } })
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
//@ts-ignore
|
|
||||||
let key_value_pairs = promises.map((x) => [
|
|
||||||
Buffer.from(x.data.content.fields.name.fields.bytes).toString("hex"),
|
|
||||||
x.data.content.fields.value,
|
|
||||||
]);
|
|
||||||
console.log("key value pairs: ", key_value_pairs);
|
|
||||||
for (let x of key_value_pairs) {
|
|
||||||
console.log("entry in key value pairs: ", x);
|
|
||||||
map.set(x[0], x[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// pagination
|
|
||||||
nextCursor = dynamic_fields.nextCursor;
|
|
||||||
hasNextPage = dynamic_fields.hasNextPage;
|
|
||||||
|
|
||||||
// Sleep to not hit rate limit.
|
|
||||||
console.log("Going to sleep for 10 seconds...");
|
|
||||||
await new Promise((f) => setTimeout(f, 10000));
|
|
||||||
} while (hasNextPage);
|
|
||||||
|
|
||||||
console.log("map size: ", map.size);
|
|
||||||
console.log("map is: ", map);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
|
@ -1,36 +0,0 @@
|
||||||
/// Fetch price feed VAAs of interest from the Pyth
|
|
||||||
/// price feed service.
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const connection = new PriceServiceConnection(
|
|
||||||
"https://xc-mainnet.pyth.network",
|
|
||||||
{
|
|
||||||
priceFeedRequestConfig: {
|
|
||||||
binary: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Fetch all price IDs
|
|
||||||
//let {data} = await axios.get("https://xc-mainnet.pyth.network/api/price_feed_ids")
|
|
||||||
//console.log("number of all price feed ids: ", data.length)
|
|
||||||
|
|
||||||
let data = [
|
|
||||||
"0x2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d",
|
|
||||||
]; // BTC/USD
|
|
||||||
const priceFeedVAAs = await connection.getLatestVaas(data);
|
|
||||||
//console.log("number of VAAs: ", priceFeedVAAs.length)
|
|
||||||
console.log(priceFeedVAAs);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
// Step 1: batch price attestation VAA
|
|
||||||
const vaa =
|
|
||||||
"AQAAAAMNAEjf1IzfqjelDP7NzxoxOdHqvKTkEZ4XIJa65e2c4LfjTs3droVWPNLQnhBoMQuzvc5NfsGRpGrf8M61aIatZuoAAiHjpPRWQKGxFlepXwu+KRnWce59I4xAwpGwyVFL7Y04WxBLmSk5GADLFPWep50he+8K7shtUPWgZvyNLsuSAuQAA7REYLohBhkMAWbd1Eo/tretS5klKVCYrr9d7XIj1/PKcPPNuFmuSjwq3gqje0h+G5xt2093Zucdnsbg/H4Rds0ABMSu6pZpijJAug1l636niiKQWYPFX2PzNLlEYrk2ZTsKGsoaCGgYlsHt/v+WlylfhTS0VReITdHu+YBVzl+2P0kABsrfwRIwkPZBT03v6b161phu2dkK9mZCq2d0vLMJBfuye3CxBq/Hu8CoHHhxNAoI/mxcwIpAl5GJGvYkh5Hr+dYBCNWQLYJZIyzeuWqezG7RCDRIp38Wg5RlHV4npCfh8UPmA1EFOqyIjJBvR5vbqCKG0Db6Xct631zMknFQPVXfN/gBCsIYM+4KrceIG9F9cDYcxCHpcLrSJ58G/JK6fJJgNhL+Jf6v4HS89qu73TrpxTClBZ3Z41A020dobWSjhsKHtuIAC35Pzpl/6yzfjd6sC2O7GIEmjzr61u8zLXdy0dhvXCrGMKyJjfENnC7UAkZi2xJNTK9EbQNhsVcZag5E19xmHj4BDZDCHuute5qNF8l3cT3GjU0BqoClAMx99rT3rA4AIHG/ZVyBHEsw1PEFoPFP3lqw7mcX49ugupQen/zhO9L7gg4AD+1MgpeLYKkY7OlRbb7irvkXyxogyfC2BPbDzm5+mqP+D96vldSh4AaWKU5/TsSTdZw/Gf4MzVMZqsZe2Ymq/MoAEJniWnOuZAy0KpqRsol0ut1YsWnRITEQzQ6h2rBHc8zlKnYd6CVuDuYOWFt2Kk81DbIC05CQoye7GHBWB8s9C+QBEf209MRQu5Rb9yI98Uzhi5amZwtpJpMZpApiYQJICRXuTO3zJv5Mou6zF4+2rmZKrNxd1aRfeEeeFlEeMdcVMkQAErerf/nroU5Jy2mHO7cA+07vCE5XRyGpIR0px5NiWS4ZdOU7A7hPljOaeYfm6Ja9hUgecAANQUNbu6wU7YVhOmQAZFO65gAAAAAAGvjNI8KrkSN3MHcLvqCNYQBc3aCYQ0jz9u7LVZY4wLugAAAAABfVLLQBUDJXSAADAAEAAQIABQCdq00LL7SxCzvTCkrW4o840gbDkKFHXt4rCDMpG1+4y0UrmrHpcqKBWFCEFIuhOJgAeZvUvmO5V1B9sTSTFOR0RQAAAAGmSiiQAAAAAABSa87////4AAAAAabx2XgAAAAAAFYHmQEAAAARAAAAFAAAAABkU7rmAAAAAGRTuuYAAAAAZFO65QAAAAGmSiiQAAAAAABSa84AAAAAZFO65FEYCiMw/VnBEbxGxbB2DBXJ35rhvZg70Zl2YzIssNwOKgHersnlGleSd7NLEiOZmE0Lv1fiRYp+Qv7NKCmGeg0AAAAAAlGRIAAAAAAAAFUJ////+AAAAAACVUROAAAAAAAAVcMBAAAAFgAAABsAAAAAZFO65gAAAABkU7rmAAAAAGRTuuUAAAAAAlGOFwAAAAAAAFEpAAAAAGRTuuW7+zHsa08VDauWCa0gAXOz5TgygR0Yulp5R9GfWpSbaxWt2VAirhNWOhGZLnJ8kb22tVvBg9nXR0NsgKSD2MhkAAAAABapRJ8AAAAAAASHx/////gAAAAAFsocsgAAAAAAA5RAAQAAAA0AAAAPAAAAAGRTuuYAAAAAZFO65gAAAABkU7rlAAAAABapRJ8AAAAAAAPX/wAAAABkU7rkUxqVIlaNYuqe+4OLpAtpuTNtspYwlD6Kuu7a7+tcTJsDrk2yntSuM9MjVoiVqgAzfmWONIs3UJ9Tcq5R8K8A1QAAAAA6FcH1AAAAAAAHsnX////4AAAAADqPu9QAAAAAAAZUSQEAAAAHAAAACAAAAABkU7rmAAAAAGRTuuYAAAAAZFO65QAAAAA6FLIgAAAAAAAGoqAAAAAAZFO65OwskI+2xF2A3AqqPN6HzEPStJul6dJktyZR2gUEko4nP6QlKEj58KFIC+YnRaRinZ6xMirrq4p5HjRLO5wa3PUAAAAAB/E72gAAAAAAAMNM////+AAAAAAH/Ql9AAAAAAAA/+wBAAAACwAAAAwAAAAAZFO65gAAAABkU7rmAAAAAGRTuuUAAAAAB/E72gAAAAAAAOpqAAAAAGRTuuM=";
|
|
||||||
|
|
||||||
// Step 2: sui shared object id
|
|
||||||
const object_id =
|
|
||||||
"0x9a6d328a6ebd906ed842e6e874e14bea69efa1c421fbfe7f689c33412a43c41c";
|
|
|
@ -1,105 +0,0 @@
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK, INITIAL_DATA_SOURCES } from "../registry";
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
let walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const initial_data_sources = INITIAL_DATA_SOURCES[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_MAINNET unset in environment");
|
|
||||||
}
|
|
||||||
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
|
|
||||||
const PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
|
|
||||||
// NOTE: Set these before calling init_pyth
|
|
||||||
const upgradeCap =
|
|
||||||
"0x3009604c845875def6c08d6bba8769f13e8fd4c600210063cdb5bf3b3c650eca";
|
|
||||||
const deployerCap =
|
|
||||||
"0x6655c230a23dc642d97fa9f8ab2a23a92813f23930e33f3fe20e63acfe3b60e9";
|
|
||||||
|
|
||||||
init_pyth(wallet, PYTH_PACKAGE, deployerCap, upgradeCap);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
/// Use a programmable transaction block to call
|
|
||||||
/// the Pyth pyth::pyth::init_pyth function.
|
|
||||||
async function init_pyth(
|
|
||||||
signer: RawSigner,
|
|
||||||
pythPackage: string,
|
|
||||||
deployerCap: string,
|
|
||||||
upgradeCap: string
|
|
||||||
) {
|
|
||||||
console.log("GOVERNANCE_CHAIN: ", initial_data_sources["GOVERNANCE_CHAIN"]);
|
|
||||||
console.log("GOVERNANCE_ADDRESS: ", [
|
|
||||||
...Buffer.from(initial_data_sources["GOVERNANCE_ADDRESS"], "hex"),
|
|
||||||
]);
|
|
||||||
console.log(
|
|
||||||
"DATA_SOURCE_CHAINS: ",
|
|
||||||
initial_data_sources["DATA_SOURCE_CHAINS"]
|
|
||||||
);
|
|
||||||
console.log(
|
|
||||||
"DATA_SOURCE_ADDRESSES: ",
|
|
||||||
initial_data_sources["DATA_SOURCE_ADDRESSES"].map((x) => [
|
|
||||||
...Buffer.from(x, "hex"),
|
|
||||||
])
|
|
||||||
);
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${pythPackage}::pyth::init_pyth`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(deployerCap),
|
|
||||||
tx.object(upgradeCap),
|
|
||||||
tx.pure(60), // stale price threshold
|
|
||||||
tx.pure(initial_data_sources["GOVERNANCE_CHAIN"]), // governance emitter chain id
|
|
||||||
tx.pure([
|
|
||||||
...Buffer.from(initial_data_sources["GOVERNANCE_ADDRESS"], "hex"),
|
|
||||||
]), // governance emitter chain address
|
|
||||||
tx.pure(initial_data_sources["DATA_SOURCE_CHAINS"]), // data source emitter chain ids
|
|
||||||
tx.pure(
|
|
||||||
initial_data_sources["DATA_SOURCE_ADDRESSES"].map((x) => [
|
|
||||||
...Buffer.from(x, "hex"),
|
|
||||||
])
|
|
||||||
), // data source addresses
|
|
||||||
tx.pure(1), // base update fee
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(1_000_000_000n);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,108 +0,0 @@
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("walletPrivateKey unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log(wallet.getAddress());
|
|
||||||
|
|
||||||
// set governance vaa to be executed
|
|
||||||
let set_data_sources_vaa_hex =
|
|
||||||
"01000000000100ac52663a7e50ab23db4f00f0607d930ffd438c5a214b3013418b57117590f76c32d2f790ec62be5f6e69d96273b1a567b8a698a8f5069c1ccd27a6874af2adc00100bc614e00000000000163278d271099bfd491951b3e648f08b1c71631e4a53674ad43e8f9f98068c38500000000000000010100000000000000000000000000000000000000000000000000000000000000010200155054474d01020015030001f346195ac02f37d60d4db8ffa6ef74cb1be3550047543a4a9ee9acf4d78697b0001aa27839d641b07743c0cb5f68c51f8cd31d2c0762bec00dc6fcd25433ef1ab5b6001ae101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71";
|
|
||||||
|
|
||||||
console.log("set_data_sources_vaa_hex: ", set_data_sources_vaa_hex);
|
|
||||||
|
|
||||||
update_data_sources(wallet, registry, set_data_sources_vaa_hex);
|
|
||||||
}
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function update_data_sources(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
vaa: string
|
|
||||||
) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
|
|
||||||
let vaa_vec_u8 = new Uint8Array(Buffer.from(vaa, "hex"));
|
|
||||||
|
|
||||||
// 0. obtain ticket authorizing governance action
|
|
||||||
let [ticket] = tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::set_data_sources::authorize_governance`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.pure(false /* whether or not action is global (as opposed to local)*/),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 1. verify VAA (that encodes the merkle root) in accumulator message
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...vaa_vec_u8]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 2. verify that the governance vaa and govrnance ticket match up
|
|
||||||
let [receipt] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::governance_message::verify_vaa`,
|
|
||||||
arguments: [tx.object(WORM_STATE), verified_vaa, ticket],
|
|
||||||
typeArguments: [`${PYTH_PACKAGE}::governance_witness::GovernanceWitness`],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 3. execute governance instruction
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::governance::execute_governance_instruction`,
|
|
||||||
arguments: [tx.object(PYTH_STATE), receipt],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,171 +0,0 @@
|
||||||
import dotenv from "dotenv";
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("walletPrivateKey unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log(wallet.getAddress());
|
|
||||||
|
|
||||||
// set the price_feed_id and price_info_object_id when trying to update a price feed
|
|
||||||
// make sure that the price feed id corresponds to the price info object id
|
|
||||||
let price_feed_id =
|
|
||||||
"0x5a035d5440f5c163069af66062bac6c79377bf88396fa27e6067bfca8096d280";
|
|
||||||
let price_info_object_id =
|
|
||||||
"0x848d1c941e117f515757b77aa562eee8bb179eee6f37ec6dad97ae0279ff4bd4";
|
|
||||||
|
|
||||||
// get accumulator msg in base 64
|
|
||||||
let { data } = await axios.get(
|
|
||||||
`https://hermes-beta.pyth.network/api/latest_vaas?ids[]=${price_feed_id}`
|
|
||||||
);
|
|
||||||
|
|
||||||
// convert accumulator msg to hex
|
|
||||||
let accumulator_message = Buffer.from(data[0], "base64").toString("hex");
|
|
||||||
|
|
||||||
update_price_feed_using_accumulator_message(
|
|
||||||
wallet,
|
|
||||||
registry,
|
|
||||||
accumulator_message,
|
|
||||||
price_info_object_id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function update_price_feed_using_accumulator_message(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
accumulator_message: string,
|
|
||||||
price_info_object_id: string
|
|
||||||
) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
console.log("accumulator_message: ", accumulator_message);
|
|
||||||
console.log("price_info_object_id: ", price_info_object_id);
|
|
||||||
|
|
||||||
console.log(
|
|
||||||
"vaa parsed from accumulator: ",
|
|
||||||
parse_vaa_bytes_from_accumulator_message(accumulator_message, true)
|
|
||||||
);
|
|
||||||
|
|
||||||
// 0. verify VAA (that encodes the merkle root) in accumulator message
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure(
|
|
||||||
parse_vaa_bytes_from_accumulator_message(accumulator_message, true)
|
|
||||||
),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 1. obtain fee coin by splitting it off from the gas coin
|
|
||||||
let [fee_coin] = tx.moveCall({
|
|
||||||
target: "0x2::coin::split",
|
|
||||||
arguments: [tx.gas, tx.pure(1)],
|
|
||||||
typeArguments: ["0x2::sui::SUI"],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 2. get authenticated price info vector, containing price updates
|
|
||||||
let [authenticated_price_infos_vector] = tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::create_authenticated_price_infos_using_accumulator`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.pure([...Buffer.from(accumulator_message, "hex")]),
|
|
||||||
verified_vaa,
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 3. use authenticated prices to update target price info object
|
|
||||||
authenticated_price_infos_vector = tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::update_single_price_feed`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
authenticated_price_infos_vector,
|
|
||||||
tx.object(price_info_object_id),
|
|
||||||
fee_coin,
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// 4. clean-up (destroy authenticated vector)
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::hot_potato_vector::destroy`,
|
|
||||||
arguments: [authenticated_price_infos_vector],
|
|
||||||
typeArguments: [`${PYTH_PACKAGE}::price_info::PriceInfo`],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse_vaa_bytes_from_accumulator_message obtains the vaa bytes embedded in an accumulator message,
|
|
||||||
// which can either be hex or base64.
|
|
||||||
// If isHex==false, then the accumulator_message is assumed to be in base64.
|
|
||||||
function parse_vaa_bytes_from_accumulator_message(
|
|
||||||
accumulator_message: string,
|
|
||||||
isHex: boolean
|
|
||||||
): number[] {
|
|
||||||
let b = isHex
|
|
||||||
? [...Buffer.from(accumulator_message, "hex")]
|
|
||||||
: [...Buffer.from(accumulator_message, "base64")];
|
|
||||||
// the bytes at offsets 0-5 in the accumulator msg encode the header, major, minor bytes
|
|
||||||
// we ignore them, since we are only interested in the VAA bytes
|
|
||||||
let trailing_size = b.slice(6, 7)[0];
|
|
||||||
let vaa_size_offset =
|
|
||||||
7 /* initial bytes (header, major, minor, trailing stuff size) */ +
|
|
||||||
trailing_size /* trailing stuff (variable number of bytes) */ +
|
|
||||||
1; /* proof_type (1 byte) */
|
|
||||||
let vaa_size_bytes = b.slice(vaa_size_offset, vaa_size_offset + 2);
|
|
||||||
let vaa_size = vaa_size_bytes[1] + 16 * vaa_size_bytes[0];
|
|
||||||
let vaa_offset = vaa_size_offset + 2;
|
|
||||||
let vaa = b.slice(vaa_offset, vaa_offset + vaa_size);
|
|
||||||
return vaa;
|
|
||||||
}
|
|
|
@ -1,138 +0,0 @@
|
||||||
/// We build a programmable transaction to look up a PriceInfoObject ID
|
|
||||||
/// from a price feed ID, update the price feed, and finally fetch
|
|
||||||
/// the updated price.
|
|
||||||
///
|
|
||||||
/// https://pyth.network/developers/price-feed-ids#pyth-evm-testnet
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_MAINNET; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
const connection = new PriceServiceConnection(
|
|
||||||
"https://xc-mainnet.pyth.network",
|
|
||||||
{
|
|
||||||
priceFeedRequestConfig: {
|
|
||||||
binary: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// NOTE: this function is a WIP
|
|
||||||
//
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(
|
|
||||||
network == "MAINNET"
|
|
||||||
? Buffer.from(walletPrivateKey, "hex")
|
|
||||||
: Buffer.from(walletPrivateKey, "base64").subarray(1)
|
|
||||||
),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log(wallet.getAddress());
|
|
||||||
|
|
||||||
// update a single price feed
|
|
||||||
const price_feed_id =
|
|
||||||
"0x2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d";
|
|
||||||
const vaa =
|
|
||||||
"AQAAAAMNAEjf1IzfqjelDP7NzxoxOdHqvKTkEZ4XIJa65e2c4LfjTs3droVWPNLQnhBoMQuzvc5NfsGRpGrf8M61aIatZuoAAiHjpPRWQKGxFlepXwu+KRnWce59I4xAwpGwyVFL7Y04WxBLmSk5GADLFPWep50he+8K7shtUPWgZvyNLsuSAuQAA7REYLohBhkMAWbd1Eo/tretS5klKVCYrr9d7XIj1/PKcPPNuFmuSjwq3gqje0h+G5xt2093Zucdnsbg/H4Rds0ABMSu6pZpijJAug1l636niiKQWYPFX2PzNLlEYrk2ZTsKGsoaCGgYlsHt/v+WlylfhTS0VReITdHu+YBVzl+2P0kABsrfwRIwkPZBT03v6b161phu2dkK9mZCq2d0vLMJBfuye3CxBq/Hu8CoHHhxNAoI/mxcwIpAl5GJGvYkh5Hr+dYBCNWQLYJZIyzeuWqezG7RCDRIp38Wg5RlHV4npCfh8UPmA1EFOqyIjJBvR5vbqCKG0Db6Xct631zMknFQPVXfN/gBCsIYM+4KrceIG9F9cDYcxCHpcLrSJ58G/JK6fJJgNhL+Jf6v4HS89qu73TrpxTClBZ3Z41A020dobWSjhsKHtuIAC35Pzpl/6yzfjd6sC2O7GIEmjzr61u8zLXdy0dhvXCrGMKyJjfENnC7UAkZi2xJNTK9EbQNhsVcZag5E19xmHj4BDZDCHuute5qNF8l3cT3GjU0BqoClAMx99rT3rA4AIHG/ZVyBHEsw1PEFoPFP3lqw7mcX49ugupQen/zhO9L7gg4AD+1MgpeLYKkY7OlRbb7irvkXyxogyfC2BPbDzm5+mqP+D96vldSh4AaWKU5/TsSTdZw/Gf4MzVMZqsZe2Ymq/MoAEJniWnOuZAy0KpqRsol0ut1YsWnRITEQzQ6h2rBHc8zlKnYd6CVuDuYOWFt2Kk81DbIC05CQoye7GHBWB8s9C+QBEf209MRQu5Rb9yI98Uzhi5amZwtpJpMZpApiYQJICRXuTO3zJv5Mou6zF4+2rmZKrNxd1aRfeEeeFlEeMdcVMkQAErerf/nroU5Jy2mHO7cA+07vCE5XRyGpIR0px5NiWS4ZdOU7A7hPljOaeYfm6Ja9hUgecAANQUNbu6wU7YVhOmQAZFO65gAAAAAAGvjNI8KrkSN3MHcLvqCNYQBc3aCYQ0jz9u7LVZY4wLugAAAAABfVLLQBUDJXSAADAAEAAQIABQCdq00LL7SxCzvTCkrW4o840gbDkKFHXt4rCDMpG1+4y0UrmrHpcqKBWFCEFIuhOJgAeZvUvmO5V1B9sTSTFOR0RQAAAAGmSiiQAAAAAABSa87////4AAAAAabx2XgAAAAAAFYHmQEAAAARAAAAFAAAAABkU7rmAAAAAGRTuuYAAAAAZFO65QAAAAGmSiiQAAAAAABSa84AAAAAZFO65FEYCiMw/VnBEbxGxbB2DBXJ35rhvZg70Zl2YzIssNwOKgHersnlGleSd7NLEiOZmE0Lv1fiRYp+Qv7NKCmGeg0AAAAAAlGRIAAAAAAAAFUJ////+AAAAAACVUROAAAAAAAAVcMBAAAAFgAAABsAAAAAZFO65gAAAABkU7rmAAAAAGRTuuUAAAAAAlGOFwAAAAAAAFEpAAAAAGRTuuW7+zHsa08VDauWCa0gAXOz5TgygR0Yulp5R9GfWpSbaxWt2VAirhNWOhGZLnJ8kb22tVvBg9nXR0NsgKSD2MhkAAAAABapRJ8AAAAAAASHx/////gAAAAAFsocsgAAAAAAA5RAAQAAAA0AAAAPAAAAAGRTuuYAAAAAZFO65gAAAABkU7rlAAAAABapRJ8AAAAAAAPX/wAAAABkU7rkUxqVIlaNYuqe+4OLpAtpuTNtspYwlD6Kuu7a7+tcTJsDrk2yntSuM9MjVoiVqgAzfmWONIs3UJ9Tcq5R8K8A1QAAAAA6FcH1AAAAAAAHsnX////4AAAAADqPu9QAAAAAAAZUSQEAAAAHAAAACAAAAABkU7rmAAAAAGRTuuYAAAAAZFO65QAAAAA6FLIgAAAAAAAGoqAAAAAAZFO65OwskI+2xF2A3AqqPN6HzEPStJul6dJktyZR2gUEko4nP6QlKEj58KFIC+YnRaRinZ6xMirrq4p5HjRLO5wa3PUAAAAAB/E72gAAAAAAAMNM////+AAAAAAH/Ql9AAAAAAAA/+wBAAAACwAAAAwAAAAAZFO65gAAAABkU7rmAAAAAGRTuuUAAAAAB/E72gAAAAAAAOpqAAAAAGRTuuM=";
|
|
||||||
const object_id =
|
|
||||||
"0x9a6d328a6ebd906ed842e6e874e14bea69efa1c421fbfe7f689c33412a43c41c";
|
|
||||||
update_price_feeds(wallet, registry, vaa, object_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function update_price_feeds(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
vaa: string,
|
|
||||||
object_id: string
|
|
||||||
) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
console.log("SUI_CLOCK_OBJECT_ID: ", SUI_CLOCK_OBJECT_ID);
|
|
||||||
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...Buffer.from(vaa, "base64")]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
let [coin] = tx.moveCall({
|
|
||||||
target: "0x2::coin::split",
|
|
||||||
arguments: [
|
|
||||||
tx.object(
|
|
||||||
"0xab59f054a27f97adb14c4d5eca7ee4dbccade998285b9c5c5400ab00f8ee672d"
|
|
||||||
),
|
|
||||||
tx.pure(1),
|
|
||||||
],
|
|
||||||
typeArguments: ["0x2::sui::SUI"],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::update_price_feeds`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${WORM_PACKAGE}::vaa::VAA`,
|
|
||||||
objects: [verified_vaa],
|
|
||||||
}),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${PYTH_PACKAGE}::price_info::PriceInfoObject`,
|
|
||||||
objects: [tx.object(object_id)],
|
|
||||||
}),
|
|
||||||
coin,
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,427 +0,0 @@
|
||||||
import axios from "axios";
|
|
||||||
import { Buffer } from "buffer";
|
|
||||||
|
|
||||||
const price_ids_to_price_objects = {
|
|
||||||
"4e53c6ef1f2f9952facdcf64551edb6d2a550985484ccce6a0477cae4c1bca3e":
|
|
||||||
"0x22d83073f60ede68f262043f367d457b161761884cd24bb17666e8c196b266eb",
|
|
||||||
c63e2a7f37a04e5e614c07238bedb25dcc38927fba8fe890597a593c0b2fa4ad:
|
|
||||||
"0x813dab097dc9a913a37553dc21a51ec264c5b3018a9148530ee5d4131d9cd948",
|
|
||||||
"389d889017db82bf42141f23b61b8de938a4e2d156e36312175bebf797f493f1":
|
|
||||||
"0x12cd27871301e7b10488d294b21fdca0e02208d60d966cc363137c432bce49dd",
|
|
||||||
"6489800bb8974169adfe35937bf6736507097d13c190d760c557108c7e93a81b":
|
|
||||||
"0x8f011dc003102d272bcfb9a1423ed9ab16bf8720102888dbdf3481dc2b81fe52",
|
|
||||||
"703e36203020ae6761e6298975764e266fb869210db9b35dd4e4225fa68217d0":
|
|
||||||
"0xbff692a9a42736393001e997f0895203c81a0b0d7d100177150d3ca2404c2264",
|
|
||||||
"2f7c4f738d498585065a4b87b637069ec99474597da7f0ca349ba8ac3ba9cac5":
|
|
||||||
"0x7b06c8e0204faba400a6b69c75b51fe84ef24c4251340f4b00eca37852ef9944",
|
|
||||||
"12848738d5db3aef52f51d78d98fc8b8b8450ffb19fb3aeeb67d38f8c147ff63":
|
|
||||||
"0xc9c0f5b0c331f02792cf47a6136fdea01772aa6e8bcd0acd7927b2cbf0c9500b",
|
|
||||||
"6e89dbed2351e3c85a9ce1c782ca1e34b6ef2c4775f1cb691739bbe6d0697e86":
|
|
||||||
"0x73198faa767ea791159fb8c64c71ff490793fbe1abec0af9d959653739b86242",
|
|
||||||
d69731a2e74ac1ce884fc3890f7ee324b6deb66147055249568869ed700882e4:
|
|
||||||
"0x7786857b0713ec6b060c873ba9ebf70cdbe8770453214aa7129e0965d3a8725d",
|
|
||||||
b962539d0fcb272a494d65ea56f94851c2bcf8823935da05bd628916e2e9edbf:
|
|
||||||
"0xd9b07adaceffb21296de31b46ef0f1db8825a83098d22af07f60205c6394bdd7",
|
|
||||||
"15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717":
|
|
||||||
"0x2b9e4beab792ea64bf6dea7d1d4455a6ff70744602a73388b3d03fc58cc0eca4",
|
|
||||||
"6c75e52531ec5fd3ef253f6062956a8508a2f03fa0a209fb7fbc51efd9d35f88":
|
|
||||||
"0xe6eb8bc3a9cdab5955a78ebf0dd3f5e4ed3458ab4491285345dd8a6d0aecd2af",
|
|
||||||
"8086320540b3d7b9b4b564e6756a29a9cb91a7cd97d5fafff63841959d3a09a0":
|
|
||||||
"0x29405b9f25ad9deb23357298732edb4383d3745ffd9a0373cf3028992d85cf99",
|
|
||||||
d37e4513ebe235fff81e453d400debaf9a49a5df2b7faa11b3831d35d7e72cb7:
|
|
||||||
"0x94223482aa78b4dc59f670ca42c8c9a93b90b0c21721f6a9d679e3f5a50e4434",
|
|
||||||
b98e7ae8af2d298d2651eb21ab5b8b5738212e13efb43bd0dfbce7a74ba4b5d0:
|
|
||||||
"0x6f5059e755771ad838278b6407a769717b40629f4655bfe9c2afe781cce5d966",
|
|
||||||
dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c:
|
|
||||||
"0x08eae5969d90a4f03e33582077407608f74df4ccc5273cae3236710f68dc348e",
|
|
||||||
"4b1ddc065d08214eb06878d6130a66665febc3fd201733e9bb481094b5de8a32":
|
|
||||||
"0xe883778d404e7c9eb7ff6fa190e8ddaa26a1b175c02cb00b1b72a4390e38c5f7",
|
|
||||||
bd4dbcbfd90e6bc6c583e07ffcb5cb6d09a0c7b1221805211ace08c837859627:
|
|
||||||
"0x0ec8b3c28c4240c5acc6c7ff145310d6d2129e6b718189be9c36828d75cf136e",
|
|
||||||
"150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e":
|
|
||||||
"0x72f36e3b229031b91718b533cde17bf48a3222f4821486f47801671f8d584308",
|
|
||||||
eff690a187797aa225723345d4612abec0bf0cec1ae62347c0e7b1905d730879:
|
|
||||||
"0x35f9fa1bc253e91cfb42396800a37886b7d5fda5e015a9a5d7eea24b4a516421",
|
|
||||||
f2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e:
|
|
||||||
"0xc6e1c6307fa87aa0f3c8e33ce786c6a80ca4aa6de74b8e1a62d9e65ad1047aac",
|
|
||||||
"58f4ee3a0fc4de834a2e96274a696d0f3d8ec45fc76131a6a49fcd18d3ca9812":
|
|
||||||
"0x75b7db1ba4946126fa9193d4d00216cd1a52a17087c35feda74905bd0386c076",
|
|
||||||
"16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1":
|
|
||||||
"0x1666ee917cb925fd3d78da42bfb14c8aa2f51ba1fdfe7a424220fa709133426a",
|
|
||||||
"2dd14c7c38aa7066c7a508aac299ebcde5165b07d5d9f2d94dfbfe41f0bc5f2e":
|
|
||||||
"0x7ceb15c8e72d0b917103e43a695e94e40dc653bccbc0806bb71d3ea6539884da",
|
|
||||||
b3a83dbe70b62241b0f916212e097465a1b31085fa30da3342dd35468ca17ca5:
|
|
||||||
"0x663c14c977c46b85b5ea3f1a97ebc5b93d8cf6cf2c94d01dbcfaef0d0ef9efdf",
|
|
||||||
"5b1703d7eb9dc8662a61556a2ca2f9861747c3fc803e01ba5a8ce35cb50a13a1":
|
|
||||||
"0x8e812924daaf7dc02188976e71d20d86baaf90129d1c1f4470b7e79084fed804",
|
|
||||||
"0afa3199e0899270a74ddcf5cc960d3c6c4414b4ca71024af1a62786dd24f52a":
|
|
||||||
"0x54499295661a8cfb2c4da4184e330ab5948c4ec7522cad5f96e923b97bc91e61",
|
|
||||||
"88e2d5cbd2474766abffb2a67a58755a2cc19beb3b309e1ded1e357253aa3623":
|
|
||||||
"0x3c90b83f0acb025336debeb37d6014cdc788d9bece7828eb1412ebe44a01d31f",
|
|
||||||
"9aa471dccea36b90703325225ac76189baf7e0cc286b8843de1de4f31f9caa7d":
|
|
||||||
"0x0ffe43da21a5d957c833d778b0f527b82980f1b210cafa592054f0a026b658b4",
|
|
||||||
f8d030e4ef460b91ad23eabbbb27aec463e3c30ecc8d5c4b71e92f54a36ccdbd:
|
|
||||||
"0xb9792f919aebd4ce7eb2a4c4b400dc40c2260f81b516e62cd3bb16a2f1cdaec3",
|
|
||||||
"6b1381ce7e874dc5410b197ac8348162c0dd6c0d4c9cd6322672d6c2b1d58293":
|
|
||||||
"0x784f3db957f968930f9ac749c9b61ef614716964d93e689a482e15c665cf210e",
|
|
||||||
"91568baa8beb53db23eb3fb7f22c6e8bd303d103919e19733f2bb642d3e7987a":
|
|
||||||
"0x847b4e30707fbaedbe1ebf261a9c08299b53389def13b6268f0aaed06118b711",
|
|
||||||
"6672325a220c0ee1166add709d5ba2e51c185888360c01edc76293257ef68b58":
|
|
||||||
"0x243536ac6942683448eb0f0013540ee72a6d31dd4f6efebb44a0918de2234a67",
|
|
||||||
"9d23a47f843f5c9284832ae6e76e4aa067dc6072a58f151d39a65a4cc792ef9f":
|
|
||||||
"0x421f3e1cc42aa5cfd4dc87de41c16bde36a9dffb3392bf61c70d6b3f0ba73a99",
|
|
||||||
be4cb6bf8f18e84b1c4fd6fafa7f048a972be26505bd58338eb66c80faa99483:
|
|
||||||
"0xf6bcaef2cb75a98bf2c16af8e0b0a36127f865be99a456ebbbbcfc2d54632fc2",
|
|
||||||
"6f9cd89ef1b7fd39f667101a91ad578b6c6ace4579d5f7f285a4b06aa4504be6":
|
|
||||||
"0x2ef5a5df964ff7cecceb968fbe84e8e12e6048518ab3c24e9343b46f6d1dd011",
|
|
||||||
"8ff1200345393bb25be4f4eeb2d97234e91f7e6213f3745a694b1436e700f271":
|
|
||||||
"0xc38286eec0a9bdc4f7f8ebff7070bf4441ddb06af48cca506cd5477f72a1ec56",
|
|
||||||
"846ae1bdb6300b817cee5fdee2a6da192775030db5615b94a465f53bd40850b5":
|
|
||||||
"0x8190db687f806ebb5a85e19789a969680e0fd8380724c4f51353ed0fd57d0a35",
|
|
||||||
f0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a:
|
|
||||||
"0x3192a035740b7d8a9a2f34e87983f43052bda1a8df4f257dba38d0d021b5afe5",
|
|
||||||
"49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688":
|
|
||||||
"0x7c9f660c492c80357be785fb2b2eeb37147343740244975bc9622311281c945c",
|
|
||||||
"05934526b94a9fbe4c4ce0c3792213032f086ee4bf58f2168a7085361af9bdc1":
|
|
||||||
"0x6535ece8ec0e0a6a6f1baf5b80f64bd8d5c18fa2f40b5023e495ad02a9564a49",
|
|
||||||
cfd44471407f4da89d469242546bb56f5c626d5bef9bd8b9327783065b43c3ef:
|
|
||||||
"0xe6638d450412b1934890a43d48606d91ad5c945a25ace66f211ccc9f606cf405",
|
|
||||||
ad04597ba688c350a97265fcb60585d6a80ebd37e147b817c94f101a32e58b4c:
|
|
||||||
"0x25325258fd0fb6965aedf380cde6636109d6e3b6c2faa47ec91d2f976bbae702",
|
|
||||||
a19d04ac696c7a6616d291c7e5d1377cc8be437c327b75adb5dc1bad745fcae8:
|
|
||||||
"0x537d0fd5f9576506fce8c81f976a5e7dd183ef875585e78cde420baa9c2dc0cf",
|
|
||||||
feff234600320f4d6bb5a01d02570a9725c1e424977f2b823f7231e6857bdae8:
|
|
||||||
"0x342f11fa43dbe19d0d5097f28526f4c40a7c9e84097a59d66bb619bff59d971b",
|
|
||||||
"2356af9529a1064d41e32d617e2ce1dca5733afa901daba9e2b68dee5d53ecf9":
|
|
||||||
"0x300a7f0a24b012be8b90b21761624f1da3109b33bf47d8b0e34816b824ce2472",
|
|
||||||
"856aac602516addee497edf6f50d39e8c95ae5fb0da1ed434a8c2ab9c3e877e9":
|
|
||||||
"0x88f936c9b272a119b80045783f70f119b5d7214242c2ffa1dab67c1d2645043c",
|
|
||||||
"70cd05521e3bdeaee2cadc1360f0d95397f03275f273199be35a029114f53a3b":
|
|
||||||
"0x3aa76ccda83a8025ad9d12ae64b8efff22fbefa2edee12ddb6a8ee62c15db628",
|
|
||||||
"19d75fde7fee50fe67753fdc825e583594eb2f51ae84e114a5246c4ab23aff4c":
|
|
||||||
"0x1e81c65a2bb74c8870cbf7620003dc978623b83da4f8ad0615d02a4c8ee9be71",
|
|
||||||
"07ad7b4a7662d19a6bc675f6b467172d2f3947fa653ca97555a9b20236406628":
|
|
||||||
"0x6728f81af4b438713f0a6bafac0a9c5b19559fcb8c9c3da9107a5c5715c77150",
|
|
||||||
"7f4f157e57bfcccd934c566df536f34933e74338fe241a5425ce561acdab164e":
|
|
||||||
"0x4f8d4f109c805cf57b95add8534e96c2652cf80fc9d6b390797367361c6f9f87",
|
|
||||||
"8879170230c9603342f3837cf9a8e76c61791198fb1271bb2552c9af7b33c933":
|
|
||||||
"0x393e4f0af86f2b7c4f6cf87053a90fce28be9507462183c08112ab680f5b222b",
|
|
||||||
"9c68c0c6999765cf6e27adf75ed551b34403126d3b0d5b686a2addb147ed4554":
|
|
||||||
"0x5e5f1fa6a90893daf6400a009781b4e146a9714c9e432719d3dd970d58782dbc",
|
|
||||||
"3112b03a41c910ed446852aacf67118cb1bec67b2cd0b9a214c58cc0eaa2ecca":
|
|
||||||
"0x25a108e8fabff628d547ade6e7fb5ffba5e3fc4a86d5563c7c9c3f7f89c2838d",
|
|
||||||
"93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7":
|
|
||||||
"0x969a55ba2749858a67b5ac3740218859ff91958711a4726e4729b6358c592541",
|
|
||||||
"83a6de4ec10bce1c0515d1aac082fd193f268f0c3b62da0c8ed1286319272415":
|
|
||||||
"0x3d4f0ed8ede749b0b7969a845a78a3e04052c5bd67632f9ca3e6b8c95e0471e0",
|
|
||||||
d00bd77d97dc5769de77f96d0e1a79cbf1364e14d0dbf046e221bce2e89710dd:
|
|
||||||
"0xa2621adcdd0a0eb0856a4bbc95a7a29ac2576915025f1ffff42a0387c659bd0f",
|
|
||||||
baa284eaf23edf975b371ba2818772f93dbae72836bbdea28b07d40f3cf8b485:
|
|
||||||
"0x7e427b11a67228418d02657537dbbe12e653fb6e25c0553e6cccfd93e09b62f9",
|
|
||||||
e65ff435be42630439c96396653a342829e877e2aafaeaf1a10d0ee5fd2cf3f2:
|
|
||||||
"0x6bc83acae136c07fb371388c5701aab8c4093719964434c48fcbb24fcd242302",
|
|
||||||
"2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445":
|
|
||||||
"0x6da106d1876e1ae75110398ba4b4170b8617fdfd7f765682fc2556cfd8fad477",
|
|
||||||
"23245bb74254e65a98cc3ff4a37443d79f527e44e449750ad304538b006f21bc":
|
|
||||||
"0xdc8c7a10228f753c4a806f00e624f6d5111bcb01fa1a25e49deb8eab5ef3b959",
|
|
||||||
"3d253019d38099c0fe918291bd08c9b887f4306a44d7d472c8031529141f275a":
|
|
||||||
"0x41810c3ebd3ff83df1d52fce4ae30ae393defeada8c35334f658b552e702a808",
|
|
||||||
"7f981f906d7cfe93f618804f1de89e0199ead306edc022d3230b3e8305f391b0":
|
|
||||||
"0xa59919df888ea0a69aeeb865145ee208e0b5e96e744276097dc5d370ce12c937",
|
|
||||||
"5c6c0d2386e3352356c3ab84434fafb5ea067ac2678a38a338c4a69ddc4bdb0c":
|
|
||||||
"0x094c553dcaefa8daccac6512a27b6bd518962acac070c4a90fd4cbcc7d93cd2d",
|
|
||||||
"78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501":
|
|
||||||
"0x7cc9590c0632c06b336a729fb338855fa50a4c1f56f6bf19792607545ebfce75",
|
|
||||||
"35f1e0d9248599d276111821c0fd636b43eef18737c3bb61c7c5c47059787a32":
|
|
||||||
"0x0beeaa7af57e04218e931c260a19f7cd5d73728ca9b992e7eaadda5a92352a6c",
|
|
||||||
"8376cfd7ca8bcdf372ced05307b24dced1f15b1afafdeff715664598f15a3dd2":
|
|
||||||
"0x5be5a532a4234472bd42f648c860cc6ce505f4abba1d1ff280c307edaa91c6e5",
|
|
||||||
"831624f51c7bd4499fe5e0f16dfa2fd22584ae4bdc496bbbbe9ba831b2d9bce9":
|
|
||||||
"0x970d1a400036ee4ed970edc5fc28c1e1a063fd70abaa5635609f84fda603477c",
|
|
||||||
"681e0eb7acf9a2a3384927684d932560fb6f67c6beb21baa0f110e993b265386":
|
|
||||||
"0xb9b0291e4443cf2919528d4f190963f59f73b2fa60d042ab6d3525ea747e012e",
|
|
||||||
c7c60099c12805bea1ae4df2243d6fe72b63be3adeb2208195e844734219967b:
|
|
||||||
"0x84acdb9701e59d7fe938dafaf9d84161838cb862e84f307124a1b1e81e6b77d1",
|
|
||||||
"8f218655050a1476b780185e89f19d2b1e1f49e9bd629efad6ac547a946bf6ab":
|
|
||||||
"0x9be7c21f6f7d2b6271fe5dfa45f71c067b0a680aa1ca46ff436afba19336059f",
|
|
||||||
ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace:
|
|
||||||
"0x4e959b3d766a38dd63a3dccadda27ee46608b13a0a17d66ba50f6c6b43794492",
|
|
||||||
ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d:
|
|
||||||
"0xfdbf22be9ca4e8be48886404f4eda806287824318d22fbd8bbea6a06ff21a749",
|
|
||||||
"7d669ddcdd23d9ef1fa9a9cc022ba055ec900e91c4cb960f3c20429d4447a411":
|
|
||||||
"0x82f7cc493ac5c0c0e32c5797cb61372a985439b996ae320926df3eaf982255f9",
|
|
||||||
af5b9ac426ae79591fde6816bc3f043b5e06d5e442f52112f76249320df22449:
|
|
||||||
"0x06e3b2601f985409297e81f89b64df8a22e4bda271630322b723c799b3ca558f",
|
|
||||||
ca3eed9b267293f6595901c734c7525ce8ef49adafe8284606ceb307afa2ca5b:
|
|
||||||
"0x60cf8eb3bb66b9f1ee5ad5971ce24f85750ed6d65357278cdd24508018c0fb77",
|
|
||||||
b00b60f88b03a6a625a8d1c048c3f66653edf217439983d037e7222c4e612819:
|
|
||||||
"0x2819077ee5dc736f75d74505f2686240d84618948ec7c94ac67139c8335c3dfa",
|
|
||||||
e13b1c1ffb32f34e1be9545583f01ef385fde7f42ee66049d30570dc866b77ca:
|
|
||||||
"0x0948ff7e93869e56cfa994a8611af061dab31d429017b64cbdbdec687807a4bd",
|
|
||||||
"8bf649e08e5a86129c57990556c8eec30e296069b524f4639549282bc5c07bb4":
|
|
||||||
"0x59432d2fe5002ddeb6d4b245cfdc6ee8a0b441ff2fb5a9d154f12ef526f40d86",
|
|
||||||
"03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5":
|
|
||||||
"0xc7dd91bb190bb6b918bcbc1671b8820088e5aab9502236f55ed204aae8d437c7",
|
|
||||||
d052e6f54fe29355d6a3c06592fdefe49fae7840df6d8655bf6d6bfb789b56e4:
|
|
||||||
"0x97e8f6a69d1e3bd5a9aea5cbc12ebaf74a2268c21220306c5a4fcce978c3134e",
|
|
||||||
"84c2dde9633d93d1bcad84e7dc41c9d56578b7ec52fabedc1f335d673df0a7c1":
|
|
||||||
"0xf8a94a60b67fc29212788ff0d125bd00a78873ce64a5f166989fa0a8a6051880",
|
|
||||||
"972776d57490d31c32279c16054e5c01160bd9a2e6af8b58780c82052b053549":
|
|
||||||
"0xfc6f0ecf57581be16f246383c1b0d39d27d47fd96097b77dd3d9a052f7efd9e5",
|
|
||||||
"9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d":
|
|
||||||
"0x2121ae366fc6daf8a79c5420153e16a31b4c6a485666c11ef4ab20dcedfc1904",
|
|
||||||
f3b50961ff387a3d68217e2715637d0add6013e7ecb83c36ae8062f97c46929e:
|
|
||||||
"0xb6dfe8dd1f13f5db49e93909e8151cda0b3eb873950522e2c6dd9409057eea03",
|
|
||||||
fd0690232b0fae5efdc402c1b9aac74176383ff7daf87d021554bda24a38e0ec:
|
|
||||||
"0x397baeff4f1ad933330bff0101898d7dd376d33467bfee1fe4c8a13b6930c669",
|
|
||||||
c719eb7bab9b2bc060167f1d1680eb34a29c490919072513b545b9785b73ee90:
|
|
||||||
"0x6a2caf39dec7db0ca51e6cf1462756efc7b3637490920c3d111cd3d7da46a6e9",
|
|
||||||
e799f456b358a2534aa1b45141d454ac04b444ed23b1440b778549bb758f2b5c:
|
|
||||||
"0x5e0b5d2f55fe8ea36709508a4741219a009e32273daa8c43278a89b4c67112e4",
|
|
||||||
"9fb0bd29fe51481b61df41e650346cc374b13c2bab2e3610364cd834a592025a":
|
|
||||||
"0xe2f01b5ad1edec664d3d646a708b26f85adde915999d56b2f15c0076a140cbd1",
|
|
||||||
ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8:
|
|
||||||
"0x8274e4be99bf8117209b4cdcc963fc397b868f360d20ecf15233591a84da752c",
|
|
||||||
"9c479b12a2b2c1051715d4d462dd7a6abbb6dccabf3af31a53f6130a1cd88efc":
|
|
||||||
"0x0e8d64923791a322a31ccc8a8c7e1da47622c776414cc2a57c73795dcdad7b88",
|
|
||||||
"43cddc3e1d0b17fec1cf2a230f46e9319887a037dcee56e053af44d8259fb042":
|
|
||||||
"0x3f0a05354694d442310e2acba79deb48621a7ca32c170d5bc068fd85dbec760e",
|
|
||||||
"0b46c1c04e9c914037cc4e0561a7e6787f6db0b89b7b65281f0f6fea1ce45a74":
|
|
||||||
"0x3a552d9bcc7dbb8f9bb088f9fc81163a27aae54b79de7192a2ee88803a2c4598",
|
|
||||||
"396a969a9c1480fa15ed50bc59149e2c0075a72fe8f458ed941ddec48bdb4918":
|
|
||||||
"0x262feca09bba056ee9b05c8d0e438c11862533bdabd42f8e79e37a03e994031e",
|
|
||||||
"26d53c97247ec18d576bbd23f88078acc22b42168dcb1d29a76501a956e26bad":
|
|
||||||
"0x35988ff2b50960965250ccfc4a1be70ffa1a327e0cacfb7618db155d5a93d95f",
|
|
||||||
d1d95644ffc11ca502f21e067a7814144c56b37018515ced4335a886a827a305:
|
|
||||||
"0xf21863beeed8d8213ad163a37547ca404879875838cefd773f45966140e03536",
|
|
||||||
a0255134973f4fdf2f8f7808354274a3b1ebc6ee438be898d045e8b56ba1fe13:
|
|
||||||
"0x94538413241766c917b5837bc66a2f07201f9df610e985bc70f6f1a65bc8b824",
|
|
||||||
e6ccd3f878cf338e6732bf59f60943e8ca2c28402fc4d9c258503b2edbe74a31:
|
|
||||||
"0xe477c82786dd5186a36ada1d0092522bc04422a133bee0882cbffebee74bdfaf",
|
|
||||||
"3b7ef6c95ceedbffbb66bff3d6135a200c5d0a0466b0c90812510ceaedebaf04":
|
|
||||||
"0x83e3bcf94d15dd8246f343a0c3a25b531da1882a237e65d0e3afa8ccc29c2b53",
|
|
||||||
a4702f0f5818258783a1e47f453cb20b0fbec32ca67260e1d19dfcdd6a4d0ebb:
|
|
||||||
"0xa6f4d72ebb3d8d3b847f560c0e1b9b53be59c61cb17905efcb78d9e59097eb61",
|
|
||||||
"3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5":
|
|
||||||
"0x2a2acf181c73055bfbce46e0bd01ffbb73b4481fee51d1442dd0fcfca7011ee1",
|
|
||||||
"05380f8817eb1316c0b35ac19c3caa92c9aa9ea6be1555986c46dce97fed6afd":
|
|
||||||
"0x415149af9fd9d712a5c543d203f5e7a4647232c93291b51cc77dda27591acdf3",
|
|
||||||
"78a3e3b8e676a8f73c439f5d749737034b139bbbe899ba5775216fba596607fe":
|
|
||||||
"0x3d537759f6eb0f5d8a0894ab553553e70c7526f15c026641ab457d6e600dd488",
|
|
||||||
b7e3904c08ddd9c0c10c6d207d390fd19e87eb6aab96304f571ed94caebdefa0:
|
|
||||||
"0xf8bb072d7779c1f9eab2b5de52a0c7db7603cfc9076151bb5a2ba1ca2ed385b0",
|
|
||||||
b5d0e0fa58a1f8b81498ae670ce93c872d14434b72c364885d4fa1b257cbb07a:
|
|
||||||
"0xede216a9f98d06bf4ebab1a696ae992590605bf9bbaf05f742b96ab5d6ba0426",
|
|
||||||
a639c04942ebfdeabf25bf1b88d6608ef387219748d77ea130bc2fa486b9614f:
|
|
||||||
"0xdc7f9dbd88b507e36df3737e44106b8594b75eb4324412e960d113f5f61e2f55",
|
|
||||||
"2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f":
|
|
||||||
"0xb148065aef7a6902b5a56404db8dc728253cc3562d6a0c274de4d4db91746cd7",
|
|
||||||
bd640cddb72063e2ede34c6a0baf6699759b9837fcb06aa0e2fbcecb9b65fde7:
|
|
||||||
"0xd3261ba9e558eda4056861879ede295549b416c75f3b756ca59145552b43ed03",
|
|
||||||
e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43:
|
|
||||||
"0xa6241689d50ea973e4e0efa11e64f05d85255e18610bd094c6ee95efc2f670b7",
|
|
||||||
"5967c196ca33171a0b2d140ddc6334b998dd71c2ddd85ba7920c35fd6ed20fe9":
|
|
||||||
"0xc9552aff3ed695958e7279ac930e5f4062fb3d9e0831c5fdcf1564019d2581b2",
|
|
||||||
c9e9d228f565c226dfb8ed5f5c9c4f57ab32b7ade7226c3239ff20911a9c3a7b:
|
|
||||||
"0x1df777cf70c4741367735002de6dbbed06346194749d9825b8578587a139f964",
|
|
||||||
d0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ded4d1:
|
|
||||||
"0x57bd3abe704df070c95bd142463c919f7eb8aab851f56a437429d40a2bcc5c04",
|
|
||||||
"1ce9069708fb49e2f1b062fa4f1be0bb151475ca506939d6d8c14386d49f43dc":
|
|
||||||
"0x44b2efb1ffc530ee28b53ad75aba15d03beeac3d3ac00ab456a95e72b6e46e28",
|
|
||||||
"6d881ecf489bb24aa10468ca332e3ea262a9bf3a8fb9db1eadac9cce544b16b1":
|
|
||||||
"0xfaa34d98d5776b63a0aa707cac04e3906a769c7b9822181e5831c3fdbe3852bc",
|
|
||||||
b881c6dad5dd3dc9a83222f8032fb439859288119afc742d43adc305cef151cc:
|
|
||||||
"0xec8b5dc385c72e1925585a8809df24b1797663b362d7ee698e94c244d95c4502",
|
|
||||||
"107918baaaafb79cd9df1c8369e44ac21136d95f3ca33f2373b78f24ba1e3e6a":
|
|
||||||
"0xdd9518d23f6500d095760fe27b6be884cb729141828840501c745fbbb4077ac1",
|
|
||||||
"6ed3c7c4427ae2f91707495fc5a891b30795d93dbb3931782ddd77a5d8cb6db7":
|
|
||||||
"0x2ad5bca64988a60eb6c015984d86f896d7780f89ba4e17d239a8d18dd0ff3c62",
|
|
||||||
ed5c2a2711e2a638573add9a8aded37028aea4ac69f1431a1ced9d9db61b2225:
|
|
||||||
"0xb1ce5c0bc015130411f74c52c69b17b34778beda878cf35582f4db10e1b37798",
|
|
||||||
"70ab610e3ed6642875f4a259dc29175452733316fee440f23fed99154d1d84f7":
|
|
||||||
"0xf159bc6a781614afd84e7452a57afcea4b02c2a1d89e2af4b345d5704648274f",
|
|
||||||
"92eea8ba1b00078cdc2ef6f64f091f262e8c7d0576ee4677572f314ebfafa4c7":
|
|
||||||
"0x17d6e86db99e31eec29b25faf06888bbb0cc5f5bad64d462c36c095384236eb8",
|
|
||||||
c81114e16ec3cbcdf20197ac974aed5a254b941773971260ce09e7caebd6af46:
|
|
||||||
"0x1f81a0a54c5acf8c6849d3555566ae3bcc078fac98ac44d95a248579e00254a6",
|
|
||||||
d3178156b7c0f6ce10d6da7d347952a672467b51708baaf1a57ffe1fb005824a:
|
|
||||||
"0x0c51789af2ef3a02c1a8dd4a5e90898ae4ab495909a0dec337d2adbf641f9e14",
|
|
||||||
"8ccb376aa871517e807358d4e3cf0bc7fe4950474dbe6c9ffc21ef64e43fc676":
|
|
||||||
"0xc1ee9666521d2494288b3a4264e7428c4be31fbfd0412b7d3e480fa66cb7868e",
|
|
||||||
"701223c92a39dbab065c4a7997fef9c41c8de26ca2bf1f808ce0a4ea1cfd421f":
|
|
||||||
"0x1e56055aa5510e42a522ac0d45baadeec54cb1ab4f80ed05fbcb01d6a63fe709",
|
|
||||||
eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a:
|
|
||||||
"0x6c9fce723d522ec708cd4ff6d363277b03fe48fafee79e2b53ce7dfd95838f72",
|
|
||||||
"4456d442a152fd1f972b18459263ef467d3c29fb9d667e30c463b086691fbc79":
|
|
||||||
"0x1d8e49343d812229fba1f2e7f04a6162224a566681d781c71b792fdc1b08947c",
|
|
||||||
"5b70af49d639eefe11f20df47a0c0760123291bb5bc55053faf797d1ff905983":
|
|
||||||
"0xce84576e03736d879f77af0652b62185234af2ccc4e2e21e276813fa0ca47dbd",
|
|
||||||
"5c2416ad4b5fe25c38ea2078927d59dad6a1d4110480c0c96c9b4421744f7507":
|
|
||||||
"0x30a78a430a10cae0d78913036d460eef5c6085c46f8ecf1ad7ba8dee76a12527",
|
|
||||||
"6d0af467543fc7daedf7abed96423877560c8d03725f3e5c87516774982a679c":
|
|
||||||
"0xf261698164fef1649da47f846c6677648f524bc880b257fc771dd65ac540487d",
|
|
||||||
abe4f2b264560a397f38eec024369356e5c1ea4f7aab94729369f144b3d97779:
|
|
||||||
"0xedbc661a883e5f47ea5fa4bf5a06374fb60827e5e0e2ac413a96187e3f39a1e3",
|
|
||||||
"2fb245b9a84554a0f15aa123cbb5f64cd263b59e9a87d80148cbffab50c69f30":
|
|
||||||
"0x65dfab50959d4f7a0e4bec441a6e0422d4dfcd0e23921c0069e35cc59cad38aa",
|
|
||||||
"19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5":
|
|
||||||
"0x511286c4c9ce19b57a4ec47efd46f4a336175d36659a5b2741e611205b184853",
|
|
||||||
"327ae981719058e6fb44e132fb4adbf1bd5978b43db0661bfdaefd9bea0c82dc":
|
|
||||||
"0x6ed3ddec8444bee9863077d70a0e8ca506242de914f1b3b581c88aecfa67bae3",
|
|
||||||
"46b8cc9347f04391764a0361e0b17c3ba394b001e7c304f7650f6376e37c321d":
|
|
||||||
"0x7e1303e5cfb944c6b0d95e5f9fab038b305c8d80054394e24d8bf64b34b8553a",
|
|
||||||
ccca1d2b0d9a9ca72aa2c849329520a378aea0ec7ef14497e67da4050d6cf578:
|
|
||||||
"0x57f5289b1bb4008c2090b3e7401e8abdfdfb1bc5b6a4d649752bd537ddc04722",
|
|
||||||
"236b30dd09a9c00dfeec156c7b1efd646c0f01825a1758e3e4a0679e3bdff179":
|
|
||||||
"0x2eb3509bf33b5e29124d61b4affc78b271c5b13aa60d4be9ec1d659ff41eaaff",
|
|
||||||
"2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d":
|
|
||||||
"0x9a6d328a6ebd906ed842e6e874e14bea69efa1c421fbfe7f689c33412a43c41c",
|
|
||||||
ef94acc2fb09eb976c6eb3000bab898cab891d5b800702cd1dc88e61d7c3c5e6:
|
|
||||||
"0x97faf2540a0b1ddff6e7f25bbfc7067eecad0334524a70e1caffdc519e2098d3",
|
|
||||||
"37505261e557e251290b8c8899453064e8d760ed5c65a779726f2490980da74c":
|
|
||||||
"0x9e743ce40f1f5cad26d7b9a83dd1b7750d9637f13edcfa95ec45ffaaac81cf4d",
|
|
||||||
"5bc91f13e412c07599167bae86f07543f076a638962b8d6017ec19dab4a82814":
|
|
||||||
"0x794047e361d3837b84a3941bb8fee704e083433404e68e20e6d54dbb5673cad5",
|
|
||||||
"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419":
|
|
||||||
"0xec956a3c13b3db5c34acc7a19b2d655886c25483254065c7f770ebe64c71b3a2",
|
|
||||||
"97d7d4c20e5a06fdb60f7a448a9e9a779f2b31c3f21121180010a4a470844aae":
|
|
||||||
"0x6928f835a904ad05c54fc1eb9d1269d5396e62eac58cf53f7967dfe54c2e8ced",
|
|
||||||
c572690504b42b57a3f7aed6bd4aae08cbeeebdadcf130646a692fe73ec1e009:
|
|
||||||
"0xf680a00084f0e61980327af92d5bd5f5eead25d5ad392c18669fe9db72ab1de8",
|
|
||||||
"735f591e4fed988cd38df74d8fcedecf2fe8d9111664e0fd500db9aa78b316b1":
|
|
||||||
"0x7b86aa064d0d8c77685fe76955f83ecc2c63d06bbdf5ee21273e6866243653f9",
|
|
||||||
"8e860fb74e60e5736b455d82f60b3728049c348e94961add5f961b02fdee2535":
|
|
||||||
"0x2746e22f8f134808ba8332294d5687b975c8dbabca51f5e773483a8b5c006de9",
|
|
||||||
"48ce0cf436bac22dad33551dfe2eb7bf9991e419a05f25aed4e90c29c3a1cdbe":
|
|
||||||
"0xd698c1ab8cecb252cd6c05371b19885d7f3937ababd26250745bb1d9fa6ee019",
|
|
||||||
fd05a384ba19863cbdfc6575bed584f041ef50554bab3ab482eabe4ea58d9f81:
|
|
||||||
"0x70e632d62a24202debf5e4099010c5c360b26f8ce9bcfbd49d52789a3c45a9c5",
|
|
||||||
"5867f5683c757393a0670ef0f701490950fe93fdb006d181c8265a831ac0c5c6":
|
|
||||||
"0xb5469f185e5a69f8591b4cc9d326eae8fddb86df381408d8ea428ad1001231b3",
|
|
||||||
"3b4656b0d92f0e995024c3dacfc28c47d11af83b374a56c26e514e9a7e46a240":
|
|
||||||
"0x6acb3837b8b069d5af140c6ec99358c862d9af443aa87ca8dbdecdc4963dc83e",
|
|
||||||
"235ddea9f40e9af5814dbcc83a418b98e3ee8df1e34e1ae4d45cf5de596023a3":
|
|
||||||
"0x43c1205fc3af779d6b9719327d60bc4cf61a2509264defcd7cbc104e731cf461",
|
|
||||||
"956740a4e169e90bb141abfe93652ae3434693bc7ca43cbcea6471408f19ab90":
|
|
||||||
"0x104ef1548854fd68403152a4661360a484e116c8926d5435325684339e7a4792",
|
|
||||||
"89a58e1cab821118133d6831f5018fba5b354afb78b2d18f575b3cbf69a4f652":
|
|
||||||
"0x81879f4a1e9a6115d6a8f1cb02a13cd6bf9e2713ccd4518c39290ab0aab855bf",
|
|
||||||
e0f87bbde799f33615b83a601b66415e850788000cd7286a3e7295f23c1bb353:
|
|
||||||
"0x4e960abf91b2868b8f7003d4c788f2971f17fdd673c552d8c6c7abdbcf1264f3",
|
|
||||||
"15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864":
|
|
||||||
"0x3b2e581f72613f5ca5845ecd97fa54133c4ef2edb41d4cee048050ae61352891",
|
|
||||||
d57d90cd8554ea0cf8268de30d5ad67fed9a8f11cce5132a49eb687aed832ea6:
|
|
||||||
"0xf7aa8fb0db1de5d2e102c3bac7c4b664c7c4f190100681e826d93784c76126f5",
|
|
||||||
"301377b122716cee1a498e7930a1836c0b1db84667cc78bbbcbad6c330ea6afb":
|
|
||||||
"0x838e80e58c62e04a7420ff13e450b65df38095aa51471975742b89a6c23e2e0a",
|
|
||||||
"6034b1f68b9363dff2cf9d53b1a88fb4d0929c65f34d532db53738853efc00ad":
|
|
||||||
"0xe42b1d1c8ee5efd399068416bf77f3f194e29a94406acc88a90dd8029bb706aa",
|
|
||||||
c19405e4c8bdcbf2a66c37ae05a27d385c8309e9d648ed20dc6ee717e7d30e17:
|
|
||||||
"0xf5a4f393712a9dc7164f0decbf90af2594a4a7199ea0d380c8e4f265ca7ddd59",
|
|
||||||
"10946973bfcc936b423d52ee2c5a538d96427626fe6d1a7dae14b1c401d1e794":
|
|
||||||
"0xc15d506b720e9e47f1ab76510eb0d8d93f1a8331a0edb71d30fe2a862693e607",
|
|
||||||
f464e36fd4ef2f1c3dc30801a9ab470dcdaaa0af14dd3cf6ae17a7fca9e051c5:
|
|
||||||
"0x858a716e3b2e9e71be3120de427ebf5ec1b461721645c245f948274f13f87c33",
|
|
||||||
"3dd2b63686a450ec7290df3a1e0b583c0481f651351edfa7636f39aed55cf8a3":
|
|
||||||
"0x3736ba57e9fa1f82ba9dcdb63142c2871ab6664ec6d2bae0e185feb698b16211",
|
|
||||||
c8acad81438490d4ebcac23b3e93f31cdbcb893fcba746ea1c66b89684faae2f:
|
|
||||||
"0xe3e1904ab43bab2a002c7cbfe2a25087211a92f163eb4f8f5ea89905fc0232e2",
|
|
||||||
"6aac625e125ada0d2a6b98316493256ca733a5808cd34ccef79b0e28c64d1e76":
|
|
||||||
"0x300a46a6b7c9574270a6a261b1fe09765b1d186991b5a7f054b2fb6b89980310",
|
|
||||||
a995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b:
|
|
||||||
"0xa9f457c3e8f90ce4147a5368ac7d1bad29fc3e7a7b566e9da8caea80e70f9015",
|
|
||||||
a5eb88d3ea93f6240d7e54b4466bc1857f7bfc1658d49a07f68096ebc0fdde3b:
|
|
||||||
"0xf23a24daea2a46388337064f8e466bdc9b848414b246769da8dc756cd19ed352",
|
|
||||||
e1d3115c6e7ac649faca875b3102f1000ab5e06b03f6903e0d699f0f5315ba86:
|
|
||||||
"0xda049b4223747412a535f4b007166fbf1b6d7de42f9f49ddf8453d5312a3e66b",
|
|
||||||
c80657b7f6f3eac27218d09d5a4e54e47b25768d9f5e10ac15fe2cf900881400:
|
|
||||||
"0xc840d2761d833abbc469ae1140d1eb5827d2cd2d1bf70520fa1281debdf99926",
|
|
||||||
"23199c2bcb1303f667e733b9934db9eca5991e765b45f5ed18bc4b231415f2fe":
|
|
||||||
"0x2d7aa5836ae880f2bd9b1b14d18abef42b5cc8116b332c368457555899fdf184",
|
|
||||||
"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b":
|
|
||||||
"0xcc7b6d3a8fc8b32878e333578ab57e96a7ef8ec4498bcc6e839c362924ea52d3",
|
|
||||||
"2f2d17abbc1e781bd87b4a5d52c8b2856886f5c482fa3593cebf6795040ab0b6":
|
|
||||||
"0xd79ce52a240701df5add9d5f325ab0222271e8ff70e36150426546470bdfd3bc",
|
|
||||||
"45b05d03edb6081e7ae536b94b450a42f43e6342791c560a481030b41f9b945d":
|
|
||||||
"0x0950d9b3f34603308ac7583d791fff9e2b9627dbbf9490f5dd7dd67410a6093f",
|
|
||||||
c7b72e5d860034288c9335d4d325da4272fe50c92ab72249d58f6cbba30e4c44:
|
|
||||||
"0x7438e09365085c82eabdf045069e749fb95b4e7d39c1ac56fa74c1f5e62500c4",
|
|
||||||
eef52e09c878ad41f6a81803e3640fe04dceea727de894edd4ea117e2e332e66:
|
|
||||||
"0x21a473555224392259558994ae30f93250f305fa14569e452539df785576b629",
|
|
||||||
"1888f463c27997174f97d2a36af29bf4648b61a5f69e67c45505a80f826bb785":
|
|
||||||
"0x70c306983d152a50905f7561c77ee48938deeb794beaef341bb294c2bb5aa996",
|
|
||||||
"2077043ee3b67b9a70949c8396c110f6cf43de8e6d9e6efdcbd557a152cf2c6e":
|
|
||||||
"0x09ecce08348f4ae9b6f3ac6fac862e441ed9876e33212694c0a4d6639a797c3f",
|
|
||||||
"23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744":
|
|
||||||
"0x5854ab7960bb36c34701a6509fd85eed4b505cf15fc68a2e6c297361c0847d50",
|
|
||||||
c1751e085ee292b8b3b9dd122a135614485a201c35dfc653553f0e28c1baf3ff:
|
|
||||||
"0x359325eddf76b5a758697c7be661653a0cec39c51214da8e5a7155b6877753fe",
|
|
||||||
"7a5bc1d2b56ad029048cd63964b3ad2776eadf812edc1a43a31406cb54bff592":
|
|
||||||
"0xfb993017bb92a8e2868d6d52b486aea8013dcd9bca8fd557306ee48bdfacbecb",
|
|
||||||
"63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3":
|
|
||||||
"0x1d0afcbaf07da5e4eb570df8b551b24ecfc889c54036de1f31a27bd15a9268d1",
|
|
||||||
"67a6f93030420c1c9e3fe37c1ab6b77966af82f995944a9fefce357a22854a80":
|
|
||||||
"0x51ca0aacdd00a18ce65eb4614b17c7a50b05861841dcb6b652936463527f38dd",
|
|
||||||
"9ff7b9a93df40f6d7edc8184173c50f4ae72152c6142f001e8202a26f951d710":
|
|
||||||
"0x374088f90087c668259444d8b4118937cc5b296f2b9f3b9a2435c019fca6c4de",
|
|
||||||
"765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2":
|
|
||||||
"0x7a410b6e800f2e2a15b5027b90e855b8cd0954fbb22dd245c4a884a6603f3e55",
|
|
||||||
"8419416ba640c8bbbcf2d464561ed7dd860db1e38e51cec9baf1e34c4be839ae":
|
|
||||||
"0x0d0f6fdadb7b2dcd0b4130e44d20195c4b13caeaa1f65c38249c330b4c1307d2",
|
|
||||||
"0b1e3297e69f162877b577b0d6a47a0d63b2392bc8499e6540da4187a63e28f8":
|
|
||||||
"0x00330abb569ac93d08b902bbd9e4c69041511417d3c88450b7291f99422c1587",
|
|
||||||
ef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52:
|
|
||||||
"0xf2a08b0909acde30ef72a7291cda5314b76e544136d83ceb0339fa2c1221aed5",
|
|
||||||
b0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd:
|
|
||||||
"0x1c15c9326be25b19496c25ee66545bfd8151c573a49c6a9075d0a5a98e4f7981",
|
|
||||||
"49601625e1a342c1f90c3fe6a03ae0251991a1d76e480d2741524c29037be28a":
|
|
||||||
"0x540988b6594c264ac5fced6a9021e98b3a3c6764e6f9d1112536c6d2445dbc63",
|
|
||||||
"9095653620547ece988ec51486dc7a6eb2efddbce8ea5bedbd53bf00cca84cf6":
|
|
||||||
"0xa351d146407bd613cb443031d474c0639f3a328af429866b38d094caa21a44a0",
|
|
||||||
"3f4b77dd904e849f70e1e812b7811de57202b49bc47c56391275c0f45f2ec481":
|
|
||||||
"0x2fc81e546084af17b8d99788f4d05254499de49fa2065d79950f19355e23c781",
|
|
||||||
"2394ce86c7d68050ce52797923860f6c1656a73fb11bd10dacb3f9c719acdd1d":
|
|
||||||
"0xc2d8c65d82ab5413d81ef44e28833be0dd286376ea47e02b26400a67f34c579e",
|
|
||||||
b82449fd728133488d2d41131cffe763f9c1693b73c544d9ef6aaa371060dd25:
|
|
||||||
"0x0624b35d4b654877cf5331f3865b28a8e872efbe40cd877a5470a1e4509107cc",
|
|
||||||
"59671f59d12dc81bae078754b7469c7434528a66d3fa91193cf204460c198f9b":
|
|
||||||
"0xc4209783660db421a861200b7164aacd682ca5bc2a53dcd40c9235b78245a0c0",
|
|
||||||
fa17ceaf30d19ba51112fdcc750cc83454776f47fb0112e4af07f15f4bb1ebc0:
|
|
||||||
"0xa8539d032e6aba8837568af71ddfe4494139ba37e2ccba5df3a6cb0b5d157c60",
|
|
||||||
"7507a4629ad0143550666bce2e7cae0b961a0f624f821feaab642fe1be632f5c":
|
|
||||||
"0xcd40ec7af217643b816992906439d9c638e4b97203bebc5a4ceb5eed92f5f82f",
|
|
||||||
fee33f2a978bf32dd6b662b65ba8083c6773b494f8401194ec1870c640860245:
|
|
||||||
"0x8c1fd6c6d4e328f4ac2d47d67bde6223d9ba3b1ab9d2d2d819462bb8a39d9079",
|
|
||||||
"20d096e088a9b85f8cf09278965b77aeb05c00769e2ddeda5ea2d07ea554b283":
|
|
||||||
"0x16f6f47720607a364c0df4718d78810d5ed8ec5ecac4c18380d6acef614a08e9",
|
|
||||||
};
|
|
||||||
|
|
||||||
const price_feed_id_url = "https://xc-mainnet.pyth.network/api/price_feed_ids"; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
// get keys from map (price feed ids)
|
|
||||||
// console.log("price ids published len: ", Object.keys(price_ids_to_price_objects).length)
|
|
||||||
// let all_keys = Object.keys(price_ids_to_price_objects).map(x=>x.toUpperCase())
|
|
||||||
// console.log("all keys: ", all_keys)
|
|
||||||
|
|
||||||
// let { data } = await axios.get(price_feed_id_url);
|
|
||||||
// console.log("data len: ", data.length)
|
|
||||||
// let not_published = []
|
|
||||||
// for (let item of data){
|
|
||||||
// //console.log("item: ", item)
|
|
||||||
// if (!(all_keys.indexOf(item.toUpperCase())>-1)){
|
|
||||||
// console.log("not found in keys")
|
|
||||||
// not_published = not_published.concat(item)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// console.log("not published: ", not_published)
|
|
||||||
// console.log("not_published length: ", not_published.length)
|
|
||||||
|
|
||||||
let buf = Buffer.from([
|
|
||||||
139, 98, 134, 111, 205, 58, 37, 255, 145, 24, 80, 100, 68, 233, 254, 81,
|
|
||||||
113, 230, 124, 97, 160, 73, 244, 180, 253, 172, 219, 195, 26, 232, 98, 187,
|
|
||||||
]).toString("hex");
|
|
||||||
console.log("buf is: ", buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
|
@ -1,178 +0,0 @@
|
||||||
/// Build a programmable txn for updating multiple price feeds.
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
||||||
import fs from "fs";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// ================== Network dependent settings ==================
|
|
||||||
let network = NETWORK.MAINNET;
|
|
||||||
const walletPrivateKey = process.env.SUI_MAINNET;
|
|
||||||
const price_connection_url = "https://xc-mainnet.pyth.network";
|
|
||||||
const PATH_TO_PRICE_ID_TO_OBJECT_MAP =
|
|
||||||
"./generated/price_id_to_object_id.mainnet.json";
|
|
||||||
// ================================================================
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
const connection = new PriceServiceConnection(price_connection_url, {
|
|
||||||
priceFeedRequestConfig: {
|
|
||||||
binary: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("Wallet key unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
console.log(wallet.getAddress());
|
|
||||||
|
|
||||||
// Price feeds IDs of feeds we are interested in updating.
|
|
||||||
// For a full list of testnet price feed ids, see:
|
|
||||||
// https://pyth.network/developers/price-feed-ids#pyth-evm-testnet
|
|
||||||
const price_feed_ids = [
|
|
||||||
"0x63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3",
|
|
||||||
// INSERT YOUR PRICE FEED ID HERE!
|
|
||||||
];
|
|
||||||
|
|
||||||
// Batch attestation VAA for price feed IDs above.
|
|
||||||
const vaas = await connection.getLatestVaas(price_feed_ids);
|
|
||||||
|
|
||||||
const price_feed_id_to_price_info_map = JSON.parse(
|
|
||||||
fs.readFileSync(PATH_TO_PRICE_ID_TO_OBJECT_MAP, "utf8")
|
|
||||||
);
|
|
||||||
// Price info objects corresponding to the price feeds we want to update.
|
|
||||||
let price_info_object_ids = [];
|
|
||||||
for (let id of price_feed_ids) {
|
|
||||||
let sliced_id = id.slice(2); // removed 0x prefix
|
|
||||||
price_info_object_ids = price_info_object_ids.concat(
|
|
||||||
price_feed_id_to_price_info_map[sliced_id]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("price info objects to be updated: ", price_info_object_ids);
|
|
||||||
update_price_feeds(wallet, registry, vaas, price_info_object_ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
// Example on updating a price feed and then getting
|
|
||||||
// the updated price.
|
|
||||||
async function update_price_feeds(
|
|
||||||
signer: RawSigner,
|
|
||||||
registry: any,
|
|
||||||
vaas: Array<string>,
|
|
||||||
price_info_object_ids: Array<string>
|
|
||||||
) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let PYTH_PACKAGE = registry["PYTH_PACKAGE_ID"];
|
|
||||||
let PYTH_STATE = registry["PYTH_STATE_ID"];
|
|
||||||
let WORM_PACKAGE = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
let WORM_STATE = registry["WORMHOLE_STATE_ID"];
|
|
||||||
console.log("PYTH_PACKAGE: ", PYTH_PACKAGE);
|
|
||||||
console.log("PYTH_STATE: ", PYTH_STATE);
|
|
||||||
console.log("WORM_PACKAGE: ", WORM_PACKAGE);
|
|
||||||
console.log("WORM_STATE: ", WORM_STATE);
|
|
||||||
|
|
||||||
// Parse our batch price attestation VAA bytes using Wormhole.
|
|
||||||
// Check out the Wormhole cross-chain bridge and generic messaging protocol here:
|
|
||||||
// https://github.com/wormhole-foundation/wormhole
|
|
||||||
let verified_vaas = [];
|
|
||||||
for (let vaa of vaas) {
|
|
||||||
let [verified_vaa] = tx.moveCall({
|
|
||||||
target: `${WORM_PACKAGE}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(WORM_STATE),
|
|
||||||
tx.pure([...Buffer.from(vaa, "base64")]),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
verified_vaas = verified_vaas.concat(verified_vaa);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a hot potato vector of price feed updates that will
|
|
||||||
// be used to update price feeds.
|
|
||||||
let [price_updates_hot_potato] = tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::create_price_infos_hot_potato`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.makeMoveVec({
|
|
||||||
type: `${WORM_PACKAGE}::vaa::VAA`,
|
|
||||||
objects: verified_vaas,
|
|
||||||
}),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update each price info object (containing our price feeds of interest)
|
|
||||||
// using the hot potato vector.
|
|
||||||
for (let price_info_object of price_info_object_ids) {
|
|
||||||
let coin = tx.splitCoins(tx.gas, [tx.pure(1)]);
|
|
||||||
[price_updates_hot_potato] = tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::update_single_price_feed`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
price_updates_hot_potato,
|
|
||||||
tx.object(price_info_object),
|
|
||||||
coin,
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Explicitly destroy the hot potato vector, since it can't be dropped
|
|
||||||
// automatically.
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::hot_potato_vector::destroy`,
|
|
||||||
arguments: [price_updates_hot_potato],
|
|
||||||
typeArguments: [`${PYTH_PACKAGE}::price_info::PriceInfo`],
|
|
||||||
});
|
|
||||||
|
|
||||||
// Get newly updated prices.
|
|
||||||
for (let price_info_object of price_info_object_ids) {
|
|
||||||
// The returned price is dropped in this example, but can be consumed by
|
|
||||||
// another downstream smart contract.
|
|
||||||
let [price] = tx.moveCall({
|
|
||||||
target: `${PYTH_PACKAGE}::pyth::get_price`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(PYTH_STATE),
|
|
||||||
tx.object(price_info_object),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
tx.setGasBudget(2000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,311 +0,0 @@
|
||||||
import * as mock from "@certusone/wormhole-sdk/lib/cjs/mock";
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
fromB64,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
testnetConnection,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import { resolve } from "path";
|
|
||||||
import * as fs from "fs";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
import { modifySignTransaction } from "@certusone/wormhole-sdk/lib/cjs/solana";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY_BASE_64; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const guardianPrivateKey = process.env.WH_TESTNET_GUARDIAN_PRIVATE_KEY;
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
const PYTH_STATE_ID = registry["PYTH_STATE_ID"];
|
|
||||||
const PYTH_PACKAGE_ID = registry["PYTH_PACKAGE_ID"];
|
|
||||||
const WORMHOLE_STATE_ID = registry["WORMHOLE_STATE_ID"];
|
|
||||||
const WORMHOLE_PACKAGE_ID = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
console.log("WORMHOLE_STATE_ID: ", WORMHOLE_STATE_ID);
|
|
||||||
console.log("PYTH_STATE_ID: ", WORMHOLE_STATE_ID);
|
|
||||||
|
|
||||||
const GOVERNANCE_EMITTER =
|
|
||||||
//"0000000000000000000000000000000000000000000000000000000000000004";
|
|
||||||
"63278d271099bfd491951b3e648f08b1c71631e4a53674ad43e8f9f98068c385";
|
|
||||||
|
|
||||||
// To upgrade Pyth, take the following steps.
|
|
||||||
// 0. Make contract changes in the "contracts" folder. These updated contracts will be posted on chain as an
|
|
||||||
// entirely new package. The old package will still be valid unless we "brick" its call-sites explicitly
|
|
||||||
// (this is done for you via the version control logic built into the Pyth contracts).
|
|
||||||
// 1. Make sure that in version_control.move, you create a new struct for the new version and update the
|
|
||||||
// current_version() and previous_version() functions accordingly. The former should point to the new version,
|
|
||||||
// and the latter should point to the old version.
|
|
||||||
// 2. Update the Move.toml file so that it points to a wormhole dependency whose Move.toml file has a "published-at" field
|
|
||||||
// specified at the top with the correct address.
|
|
||||||
// 3. Execute this script!
|
|
||||||
//
|
|
||||||
async function main() {
|
|
||||||
if (guardianPrivateKey === undefined) {
|
|
||||||
throw new Error("TESTNET_GUARDIAN_PRIVATE_KEY unset in environment");
|
|
||||||
}
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("TESTNET_WALLET_PRIVATE_KEY unset in environment");
|
|
||||||
}
|
|
||||||
console.log("priv key: ", walletPrivateKey);
|
|
||||||
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(
|
|
||||||
network == "MAINNET"
|
|
||||||
? Buffer.from(walletPrivateKey, "hex")
|
|
||||||
: Buffer.from(walletPrivateKey, "base64")
|
|
||||||
),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("wallet address: ", wallet.getAddress());
|
|
||||||
|
|
||||||
const pythContractsPath = resolve(`${__dirname}/../../contracts`);
|
|
||||||
|
|
||||||
// Build for digest.
|
|
||||||
const { modules, dependencies, digest } =
|
|
||||||
buildForBytecodeAndDigest(pythContractsPath);
|
|
||||||
console.log("dependencies", dependencies);
|
|
||||||
console.log("digest", digest.toString("hex"));
|
|
||||||
|
|
||||||
// ===========================================================================================
|
|
||||||
// Construct VAA. We will use the signed VAA when we execute the upgrade.
|
|
||||||
// For a mainnet contract upgrade, we would not construct AND sign the VAA here. Instead, all
|
|
||||||
// the guardians would have to sign the upgrade VAA.
|
|
||||||
const guardians = new mock.MockGuardians(0, [guardianPrivateKey]);
|
|
||||||
const timestamp = 12345678;
|
|
||||||
const governance = new mock.GovernanceEmitter(GOVERNANCE_EMITTER);
|
|
||||||
|
|
||||||
const action = 0;
|
|
||||||
const chain = 21;
|
|
||||||
|
|
||||||
// construct VAA inner payload
|
|
||||||
|
|
||||||
const magic = Buffer.alloc(4);
|
|
||||||
magic.write("PTGM", 0); // magic
|
|
||||||
console.log("magic buffer: ", magic);
|
|
||||||
|
|
||||||
let inner_payload = Buffer.alloc(8); // 4 (magic) + 1 (module name) + 1 (action) + 2 (target chain) = 8
|
|
||||||
inner_payload.write(magic.toString(), 0); // magic = "PTGM"
|
|
||||||
inner_payload.writeUInt8(1, 4); // moduleName = 1
|
|
||||||
inner_payload.writeUInt8(0, 5); // action = 0
|
|
||||||
inner_payload.writeUInt16BE(21, 6); // target chain = 21
|
|
||||||
inner_payload = Buffer.concat([inner_payload, digest]);
|
|
||||||
|
|
||||||
console.log("digest: ", digest.toString("hex"));
|
|
||||||
console.log("inner payload: ", inner_payload.toString("hex"));
|
|
||||||
|
|
||||||
// create governance message
|
|
||||||
let msg = governance.publishGovernanceMessage(
|
|
||||||
timestamp,
|
|
||||||
"",
|
|
||||||
inner_payload,
|
|
||||||
action,
|
|
||||||
chain
|
|
||||||
);
|
|
||||||
msg.writeUInt8(0x1, 84 - 33 + 31); // here we insert an 0x1 in the right place to make the module name "0x00000000000000000000000000000001"
|
|
||||||
|
|
||||||
console.log("governance msg: ", msg.toString("hex"));
|
|
||||||
|
|
||||||
// sign governance message
|
|
||||||
const signedVaa = guardians.addSignatures(msg, [0]);
|
|
||||||
console.log("Upgrade VAA:", signedVaa.toString("hex"));
|
|
||||||
// ===========================================================================================
|
|
||||||
|
|
||||||
//Execute upgrade with signed governance VAA.
|
|
||||||
const upgradeResults = await upgradePyth(
|
|
||||||
wallet,
|
|
||||||
PYTH_STATE_ID,
|
|
||||||
WORMHOLE_STATE_ID,
|
|
||||||
modules,
|
|
||||||
dependencies,
|
|
||||||
signedVaa
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("tx digest", upgradeResults.digest);
|
|
||||||
console.log("tx effects", JSON.stringify(upgradeResults.effects!));
|
|
||||||
console.log("tx events", JSON.stringify(upgradeResults.events!));
|
|
||||||
|
|
||||||
const migrateResults = await migratePyth(
|
|
||||||
wallet,
|
|
||||||
PYTH_STATE_ID,
|
|
||||||
WORMHOLE_STATE_ID,
|
|
||||||
signedVaa
|
|
||||||
);
|
|
||||||
console.log("tx digest", migrateResults.digest);
|
|
||||||
console.log("tx effects", JSON.stringify(migrateResults.effects!));
|
|
||||||
console.log("tx events", JSON.stringify(migrateResults.events!));
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
function buildForBytecodeAndDigest(packagePath: string) {
|
|
||||||
const buildOutput: {
|
|
||||||
modules: string[];
|
|
||||||
dependencies: string[];
|
|
||||||
digest: number[];
|
|
||||||
} = JSON.parse(
|
|
||||||
execSync(
|
|
||||||
`sui move build --dump-bytecode-as-base64 -p ${packagePath} 2> /dev/null`,
|
|
||||||
{ encoding: "utf-8" }
|
|
||||||
)
|
|
||||||
);
|
|
||||||
return {
|
|
||||||
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
|
||||||
dependencies: buildOutput.dependencies.map((d: string) =>
|
|
||||||
normalizeSuiObjectId(d)
|
|
||||||
),
|
|
||||||
digest: Buffer.from(buildOutput.digest),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getPackageId(
|
|
||||||
provider: JsonRpcProvider,
|
|
||||||
stateId: string
|
|
||||||
): Promise<string> {
|
|
||||||
const state = await provider
|
|
||||||
.getObject({
|
|
||||||
id: stateId,
|
|
||||||
options: {
|
|
||||||
showContent: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((result) => {
|
|
||||||
if (result.data?.content?.dataType == "moveObject") {
|
|
||||||
return result.data.content.fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error("not move object");
|
|
||||||
});
|
|
||||||
|
|
||||||
if ("upgrade_cap" in state) {
|
|
||||||
return state.upgrade_cap.fields.package;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error("upgrade_cap not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
async function upgradePyth(
|
|
||||||
signer: RawSigner,
|
|
||||||
pythStateId: string,
|
|
||||||
wormholeStateId: string,
|
|
||||||
modules: number[][],
|
|
||||||
dependencies: string[],
|
|
||||||
signedVaa: Buffer
|
|
||||||
) {
|
|
||||||
const pythPackage = await getPackageId(signer.provider, pythStateId);
|
|
||||||
const wormholePackage = await getPackageId(signer.provider, wormholeStateId);
|
|
||||||
|
|
||||||
console.log("pythPackage: ", pythPackage);
|
|
||||||
console.log("wormholePackage: ", wormholePackage);
|
|
||||||
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
const [verifiedVaa] = tx.moveCall({
|
|
||||||
target: `${wormholePackage}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(wormholeStateId),
|
|
||||||
tx.pure(Array.from(signedVaa)),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
const [decreeTicket] = tx.moveCall({
|
|
||||||
target: `${pythPackage}::contract_upgrade::authorize_governance`,
|
|
||||||
arguments: [tx.object(pythStateId)],
|
|
||||||
});
|
|
||||||
|
|
||||||
const [decreeReceipt] = tx.moveCall({
|
|
||||||
target: `${wormholePackage}::governance_message::verify_vaa`,
|
|
||||||
arguments: [tx.object(wormholeStateId), verifiedVaa, decreeTicket],
|
|
||||||
typeArguments: [`${pythPackage}::governance_witness::GovernanceWitness`],
|
|
||||||
});
|
|
||||||
|
|
||||||
// Authorize upgrade.
|
|
||||||
const [upgradeTicket] = tx.moveCall({
|
|
||||||
target: `${pythPackage}::contract_upgrade::authorize_upgrade`,
|
|
||||||
arguments: [tx.object(pythStateId), decreeReceipt],
|
|
||||||
});
|
|
||||||
|
|
||||||
// Build and generate modules and dependencies for upgrade.
|
|
||||||
const [upgradeReceipt] = tx.upgrade({
|
|
||||||
modules,
|
|
||||||
dependencies,
|
|
||||||
packageId: pythPackage,
|
|
||||||
ticket: upgradeTicket,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Commit upgrade.
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${pythPackage}::contract_upgrade::commit_upgrade`,
|
|
||||||
arguments: [tx.object(pythStateId), upgradeReceipt],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2_000_000_000n);
|
|
||||||
|
|
||||||
return signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function migratePyth(
|
|
||||||
signer: RawSigner,
|
|
||||||
pythStateId: string,
|
|
||||||
wormholeStateId: string,
|
|
||||||
signedUpgradeVaa: Buffer
|
|
||||||
) {
|
|
||||||
const pythPackage = await getPackageId(signer.provider, pythStateId);
|
|
||||||
const wormholePackage = await getPackageId(signer.provider, wormholeStateId);
|
|
||||||
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
const [verifiedVaa] = tx.moveCall({
|
|
||||||
target: `${wormholePackage}::vaa::parse_and_verify`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(wormholeStateId),
|
|
||||||
tx.pure(Array.from(signedUpgradeVaa)),
|
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
const [decreeTicket] = tx.moveCall({
|
|
||||||
target: `${pythPackage}::contract_upgrade::authorize_governance`,
|
|
||||||
arguments: [tx.object(pythStateId)],
|
|
||||||
});
|
|
||||||
const [decreeReceipt] = tx.moveCall({
|
|
||||||
target: `${wormholePackage}::governance_message::verify_vaa`,
|
|
||||||
arguments: [tx.object(wormholeStateId), verifiedVaa, decreeTicket],
|
|
||||||
typeArguments: [`${pythPackage}::governance_witness::GovernanceWitness`],
|
|
||||||
});
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${pythPackage}::migrate::migrate`,
|
|
||||||
arguments: [tx.object(pythStateId), decreeReceipt],
|
|
||||||
});
|
|
||||||
|
|
||||||
tx.setGasBudget(2_000_000_000n);
|
|
||||||
|
|
||||||
return signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
export enum NETWORK {
|
|
||||||
DEVNET = "DEVNET",
|
|
||||||
TESTNET = "TESTNET",
|
|
||||||
MAINNET = "MAINNET",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const REGISTRY = {
|
|
||||||
DEVNET: {
|
|
||||||
PYTH_PACKAGE_ID:
|
|
||||||
"0xcd7f3fe6338a618e3d8df8445cd8e8daa0af35c956c4d35cbac78d63d7869ece",
|
|
||||||
PYTH_STATE_ID:
|
|
||||||
"0x5a7ef4ddaa1035448f11644f1eb0c4ca26f6bf094c8ee5c3309ddbed386b03fa",
|
|
||||||
WORMHOLE_PACKAGE_ID:
|
|
||||||
"0xef530c697826910f09c82292a0344d11e8371f9462d0d1f470b79cde92311188",
|
|
||||||
WORMHOLE_STATE_ID:
|
|
||||||
"0xd7e478de3e6925127da439586a64867ada00405fa683e3ab9c4359c3bbcfd9ca",
|
|
||||||
RPC_URL: "http://0.0.0.0:9000",
|
|
||||||
},
|
|
||||||
TESTNET: {
|
|
||||||
PYTH_PACKAGE_ID:
|
|
||||||
"0x41295e8e99151ca4d18b8982122f29745a4e9e66c25565c9ba9a136320644810",
|
|
||||||
PYTH_STATE_ID:
|
|
||||||
"0xd3e79c2c083b934e78b3bd58a490ec6b092561954da6e7322e1e2b3c8abfddc0",
|
|
||||||
WORMHOLE_PACKAGE_ID:
|
|
||||||
"0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94",
|
|
||||||
WORMHOLE_STATE_ID:
|
|
||||||
"0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790",
|
|
||||||
RPC_URL: "https://fullnode.testnet.sui.io:443",
|
|
||||||
},
|
|
||||||
MAINNET: {
|
|
||||||
PYTH_PACKAGE_ID:
|
|
||||||
"0x00b53b0f4174108627fbee72e2498b58d6a2714cded53fac537034c220d26302",
|
|
||||||
PYTH_STATE_ID:
|
|
||||||
"0xf9ff3ef935ef6cdfb659a203bf2754cebeb63346e29114a535ea6f41315e5a3f",
|
|
||||||
WORMHOLE_PACKAGE_ID:
|
|
||||||
"0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a",
|
|
||||||
WORMHOLE_STATE_ID:
|
|
||||||
"0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c",
|
|
||||||
RPC_URL: "https://fullnode.mainnet.sui.io:443",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const INITIAL_DATA_SOURCES = {
|
|
||||||
// Devnet params are same as testnet.
|
|
||||||
DEVNET: {
|
|
||||||
GOVERNANCE_ADDRESS:
|
|
||||||
"63278d271099bfd491951b3e648f08b1c71631e4a53674ad43e8f9f98068c385",
|
|
||||||
GOVERNANCE_CHAIN: 1,
|
|
||||||
DATA_SOURCE_ADDRESSES: [
|
|
||||||
"f346195ac02f37d60d4db8ffa6ef74cb1be3550047543a4a9ee9acf4d78697b0",
|
|
||||||
"a27839d641b07743c0cb5f68c51f8cd31d2c0762bec00dc6fcd25433ef1ab5b6",
|
|
||||||
],
|
|
||||||
DATA_SOURCE_CHAINS: [1, 26],
|
|
||||||
},
|
|
||||||
TESTNET: {
|
|
||||||
GOVERNANCE_ADDRESS:
|
|
||||||
"63278d271099bfd491951b3e648f08b1c71631e4a53674ad43e8f9f98068c385",
|
|
||||||
GOVERNANCE_CHAIN: 1,
|
|
||||||
DATA_SOURCE_ADDRESSES: [
|
|
||||||
"f346195ac02f37d60d4db8ffa6ef74cb1be3550047543a4a9ee9acf4d78697b0",
|
|
||||||
"a27839d641b07743c0cb5f68c51f8cd31d2c0762bec00dc6fcd25433ef1ab5b6",
|
|
||||||
],
|
|
||||||
DATA_SOURCE_CHAINS: [1, 26],
|
|
||||||
},
|
|
||||||
MAINNET: {
|
|
||||||
GOVERNANCE_ADDRESS:
|
|
||||||
"5635979a221c34931e32620b9293a463065555ea71fe97cd6237ade875b12e9e",
|
|
||||||
GOVERNANCE_CHAIN: 1,
|
|
||||||
DATA_SOURCE_ADDRESSES: [
|
|
||||||
"6bb14509a612f01fbbc4cffeebd4bbfb492a86df717ebe92eb6df432a3f00a25",
|
|
||||||
"f8cd23c2ab91237730770bbea08d61005cdda0984348f3f6eecb559638c0bba0",
|
|
||||||
],
|
|
||||||
DATA_SOURCE_CHAINS: [1, 26],
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,58 +0,0 @@
|
||||||
let initial_guardians = [
|
|
||||||
"D2CC37A4dc036a8D232b48f62cDD4731412f4890",
|
|
||||||
"54Ce5B4D348fb74B958e8966e2ec3dBd4958a7cd",
|
|
||||||
"107A0086b32d7A0977926A205131d8731D39cbEB",
|
|
||||||
"8192b6E7387CCd768277c17DAb1b7a5027c0b3Cf",
|
|
||||||
"71AA1BE1D36CaFE3867910F99C09e347899C19C3",
|
|
||||||
"114De8460193bdf3A2fCf81f86a09765F4762fD1",
|
|
||||||
"74a3bf913953D695260D88BC1aA25A4eeE363ef0",
|
|
||||||
"11b39756C042441BE6D8650b69b54EbE715E2343",
|
|
||||||
"8C82B2fd82FaeD2711d59AF0F2499D16e726f6b2",
|
|
||||||
"58CC3AE5C097b213cE3c81979e1B9f9570746AA5",
|
|
||||||
"DA798F6896A3331F64b48c12D1D57Fd9cbe70811",
|
|
||||||
"AF45Ced136b9D9e24903464AE889F5C8a723FC14",
|
|
||||||
"f93124b7c738843CBB89E864c862c38cddCccF95",
|
|
||||||
"fF6CB952589BDE862c25Ef4392132fb9D4A42157",
|
|
||||||
"6FbEBc898F403E4773E95feB15E80C9A99c8348d",
|
|
||||||
"000aC0076727b35FBea2dAc28fEE5cCB0fEA768e",
|
|
||||||
"178e21ad2E77AE06711549CFBB1f9c7a9d8096e8",
|
|
||||||
"5E1487F35515d02A92753504a8D75471b9f49EdB",
|
|
||||||
"15e7cAF07C4e3DC8e7C469f92C8Cd88FB8005a20",
|
|
||||||
];
|
|
||||||
|
|
||||||
let ordered_guardians = [
|
|
||||||
// 5 is missing
|
|
||||||
"58CC3AE5C097b213cE3c81979e1B9f9570746AA5",
|
|
||||||
"fF6CB952589BDE862c25Ef4392132fb9D4A42157",
|
|
||||||
"114De8460193bdf3A2fCf81f86a09765F4762fD1",
|
|
||||||
"107A0086b32d7A0977926A205131d8731D39cbEB",
|
|
||||||
"8C82B2fd82FaeD2711d59AF0F2499D16e726f6b2",
|
|
||||||
"11b39756c042441be6d8650b69b54ebe715e2343",
|
|
||||||
"54Ce5B4D348fb74B958e8966e2ec3dBd4958a7cd",
|
|
||||||
"15e7cAF07C4e3DC8e7C469f92C8Cd88FB8005a20",
|
|
||||||
"74a3bf913953D695260D88BC1aA25A4eeE363ef0",
|
|
||||||
"000aC0076727b35FBea2dAc28fEE5cCB0fEA768e",
|
|
||||||
"AF45Ced136b9D9e24903464AE889F5C8a723FC14",
|
|
||||||
"f93124b7c738843CBB89E864c862c38cddCccF95",
|
|
||||||
"D2CC37A4dc036a8D232b48f62cDD4731412f4890",
|
|
||||||
"DA798F6896A3331F64b48c12D1D57Fd9cbe70811",
|
|
||||||
"71AA1BE1D36CaFE3867910F99C09e347899C19C3",
|
|
||||||
"8192b6E7387CCd768277c17DAb1b7a5027c0b3Cf",
|
|
||||||
"178e21ad2E77AE06711549CFBB1f9c7a9d8096e8",
|
|
||||||
"5E1487F35515d02A92753504a8D75471b9f49EdB",
|
|
||||||
"6FbEBc898F403E4773E95feB15E80C9A99c8348d",
|
|
||||||
];
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
initial_guardians = initial_guardians.map((x) => x.toLowerCase());
|
|
||||||
ordered_guardians = ordered_guardians.map((x) => x.toLowerCase());
|
|
||||||
|
|
||||||
for (let g of initial_guardians) {
|
|
||||||
console.log("ordered_guardians.indexOf(g): ", ordered_guardians.indexOf(g));
|
|
||||||
if (ordered_guardians.indexOf(g) < 0) {
|
|
||||||
console.log("guardian is not in ordered_guardians: ", g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
|
@ -1,128 +0,0 @@
|
||||||
import * as mock from "@certusone/wormhole-sdk/lib/cjs/mock";
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
import {
|
|
||||||
SetDataSourcesInstruction,
|
|
||||||
DataSource,
|
|
||||||
CHAINS,
|
|
||||||
HexString32Bytes,
|
|
||||||
SetFeeInstruction,
|
|
||||||
AuthorizeGovernanceDataSourceTransferInstruction,
|
|
||||||
SetValidPeriodInstruction,
|
|
||||||
} from "../../../../governance/xc_governance_sdk_js/src/index";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET_ALT_KEY_BASE_64; // <= NOTE: Update this when changing network
|
|
||||||
const guardianPrivateKey = process.env.WH_TESTNET_GUARDIAN_PRIVATE_KEY; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
const PYTH_STATE_ID = registry["PYTH_STATE_ID"];
|
|
||||||
const PYTH_PACKAGE_ID = registry["PYTH_PACKAGE_ID"];
|
|
||||||
const WORMHOLE_STATE_ID = registry["WORMHOLE_STATE_ID"];
|
|
||||||
const WORMHOLE_PACKAGE_ID = registry["WORMHOLE_PACKAGE_ID"];
|
|
||||||
console.log("WORMHOLE_STATE_ID: ", WORMHOLE_STATE_ID);
|
|
||||||
console.log("PYTH_STATE_ID: ", WORMHOLE_STATE_ID);
|
|
||||||
|
|
||||||
const GOVERNANCE_EMITTER =
|
|
||||||
"63278d271099bfd491951b3e648f08b1c71631e4a53674ad43e8f9f98068c385";
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (guardianPrivateKey === undefined) {
|
|
||||||
throw new Error("guardianPrivateKey unset in environment");
|
|
||||||
}
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("walletPrivateKey unset in environment");
|
|
||||||
}
|
|
||||||
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(
|
|
||||||
network == "MAINNET"
|
|
||||||
? Buffer.from(walletPrivateKey, "hex")
|
|
||||||
: Buffer.from(walletPrivateKey, "base64")
|
|
||||||
),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("wallet address: ", wallet.getAddress());
|
|
||||||
|
|
||||||
// =============================== define mock emitter and guardians ===============================
|
|
||||||
const guardians = new mock.MockGuardians(0, [guardianPrivateKey]);
|
|
||||||
const governance = new mock.GovernanceEmitter(GOVERNANCE_EMITTER);
|
|
||||||
|
|
||||||
// =============================== construct governance VAA payload ===============================
|
|
||||||
|
|
||||||
// const action = 2; // set data sources
|
|
||||||
// const chain = 21;
|
|
||||||
|
|
||||||
// const magic = Buffer.alloc(4);
|
|
||||||
// magic.write("PTGM", 0); // magic
|
|
||||||
// console.log("magic buffer: ", magic);
|
|
||||||
|
|
||||||
// let ds = new SetDataSourcesInstruction(21, [
|
|
||||||
// new DataSource(
|
|
||||||
// CHAINS.solana,
|
|
||||||
// new HexString32Bytes(
|
|
||||||
// "0xf346195ac02f37d60d4db8ffa6ef74cb1be3550047543a4a9ee9acf4d78697b0"
|
|
||||||
// )
|
|
||||||
// ),
|
|
||||||
// new DataSource(
|
|
||||||
// CHAINS.pythnet,
|
|
||||||
// new HexString32Bytes(
|
|
||||||
// "0xa27839d641b07743c0cb5f68c51f8cd31d2c0762bec00dc6fcd25433ef1ab5b6"
|
|
||||||
// )
|
|
||||||
// ),
|
|
||||||
// new DataSource(
|
|
||||||
// CHAINS.pythnet,
|
|
||||||
// new HexString32Bytes(
|
|
||||||
// "0xe101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71"
|
|
||||||
// )
|
|
||||||
// ),
|
|
||||||
// ]);
|
|
||||||
|
|
||||||
// let payload = ds.serialize();
|
|
||||||
|
|
||||||
let payload = Buffer.from(
|
|
||||||
"5054474d0103001500000000000000050000000000000005",
|
|
||||||
"hex"
|
|
||||||
);
|
|
||||||
|
|
||||||
// =============================== construct governance message ===============================
|
|
||||||
|
|
||||||
let msg = governance.publishMessage(0, payload, 1);
|
|
||||||
console.log("msg: ", msg);
|
|
||||||
// let msg = governance.publishGovernanceMessage(
|
|
||||||
// timestamp,
|
|
||||||
// "",
|
|
||||||
// payload,
|
|
||||||
// action,
|
|
||||||
// chain
|
|
||||||
// );
|
|
||||||
|
|
||||||
// // Pyth expects the module name for an action to be "0x00000000000000000000000000000001", so
|
|
||||||
// // we write 0x1 in the right position to convert the module name from "0x00000000000000000000000000000000" -> "0x00000000000000000000000000000001"
|
|
||||||
// msg.writeUInt8(0x1, 84 - 33 + 31);
|
|
||||||
|
|
||||||
// console.log("governance msg: ", msg.toString("hex"));
|
|
||||||
|
|
||||||
// =============================== sign governance message ===============================
|
|
||||||
|
|
||||||
const signedVaa = guardians.addSignatures(msg, [0]);
|
|
||||||
console.log("signed VAA:", signedVaa.toString("hex"));
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
|
@ -1,63 +0,0 @@
|
||||||
/// We build a programmable txn to create a price feed.
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import {
|
|
||||||
RawSigner,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
TransactionBlock,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
let sender = await wallet.getAddress();
|
|
||||||
let recipient =
|
|
||||||
"0x4ed01b6abcc271a5c7a1e05ee9344d6eb72d0c1f2483a1c600b46d73a22ba764";
|
|
||||||
console.log("Sender: ", sender);
|
|
||||||
transfer_tokens(wallet, recipient);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function transfer_tokens(signer: RawSigner, recipient: string) {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
let coin = tx.splitCoins(tx.gas, [tx.pure(100000000000)]);
|
|
||||||
|
|
||||||
tx.transferObjects([coin], tx.pure(recipient));
|
|
||||||
|
|
||||||
tx.setGasBudget(1000000000);
|
|
||||||
|
|
||||||
let result = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(result);
|
|
||||||
return result;
|
|
||||||
}
|
|
|
@ -1,111 +0,0 @@
|
||||||
/// Deploy Pyth to Sui testnet (devnet deploy can be done via CLI)
|
|
||||||
import {
|
|
||||||
fromB64,
|
|
||||||
getPublishedObjectChanges,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
testnetConnection,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import fs from "fs";
|
|
||||||
import { resolve } from "path";
|
|
||||||
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
// Load registry and provider.
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
await publishPackage(wallet, "~/developer/wormhole/sui/wormhole");
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function publishPackage(
|
|
||||||
signer: RawSigner,
|
|
||||||
//network: Network,
|
|
||||||
packagePath: string
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
// Build contracts
|
|
||||||
const buildOutput: {
|
|
||||||
modules: string[];
|
|
||||||
dependencies: string[];
|
|
||||||
} = JSON.parse(
|
|
||||||
execSync(
|
|
||||||
`sui move build --dump-bytecode-as-base64 --path ${packagePath} 2> /dev/null`,
|
|
||||||
{
|
|
||||||
encoding: "utf-8",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("buildOutput: ", buildOutput);
|
|
||||||
|
|
||||||
// Publish contracts
|
|
||||||
const transactionBlock = new TransactionBlock();
|
|
||||||
|
|
||||||
// important
|
|
||||||
transactionBlock.setGasBudget(5000000000);
|
|
||||||
|
|
||||||
const [upgradeCap] = transactionBlock.publish({
|
|
||||||
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
|
||||||
dependencies: buildOutput.dependencies.map((d: string) =>
|
|
||||||
normalizeSuiObjectId(d)
|
|
||||||
),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Transfer upgrade capability to deployer
|
|
||||||
transactionBlock.transferObjects(
|
|
||||||
[upgradeCap],
|
|
||||||
transactionBlock.pure(await signer.getAddress())
|
|
||||||
);
|
|
||||||
|
|
||||||
// Execute transactions
|
|
||||||
const res = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update network-specific Move.toml with package ID
|
|
||||||
const publishEvents = getPublishedObjectChanges(res);
|
|
||||||
if (publishEvents.length !== 1) {
|
|
||||||
throw new Error(
|
|
||||||
"No publish event found in transaction:" +
|
|
||||||
JSON.stringify(res.objectChanges, null, 2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return publish transaction info
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,120 +0,0 @@
|
||||||
/// Initialize Wormhole on Sui testnet
|
|
||||||
import {
|
|
||||||
fromB64,
|
|
||||||
getPublishedObjectChanges,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
testnetConnection,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import fs from "fs";
|
|
||||||
import { resolve } from "path";
|
|
||||||
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
// Load registry and provider.
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
await init_wormhole(wallet, registry["WORMHOLE_PACKAGE_ID"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function init_wormhole(signer: RawSigner, WORMHOLE_PACKAGE_ID: string) {
|
|
||||||
try {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
tx.setGasBudget(2500000000);
|
|
||||||
|
|
||||||
let DEPLOYER_CAP =
|
|
||||||
"0x922ff3519eb0e71afaa7c6a7a8a1d074a2269d8ace73e8147bee286dd2d122a1";
|
|
||||||
let UPGRADE_CAP =
|
|
||||||
"0x21a346dae01e5f57829f8a2a0bf744b6be4e6d1131faf218b82f0f96708be99f";
|
|
||||||
let GOVERNANCE_CHAIN = 1;
|
|
||||||
let GOVERNANCE_CONTRACT = "04";
|
|
||||||
let GUARDIAN_SET_INDEX = 0; // this should be 3 or higher for mainnet (can check by parsing VAA)
|
|
||||||
let INITIAL_GUARDIANS = ["13947bd48b18e53fdaeee77f3473391ac727c638"]; // testnet guardian
|
|
||||||
// Ordered mainnet guardians
|
|
||||||
// let INITIAL_MAINNET_GUARDIANS =
|
|
||||||
// [
|
|
||||||
// "58CC3AE5C097b213cE3c81979e1B9f9570746AA5",
|
|
||||||
// "fF6CB952589BDE862c25Ef4392132fb9D4A42157",
|
|
||||||
// "114De8460193bdf3A2fCf81f86a09765F4762fD1",
|
|
||||||
// "107A0086b32d7A0977926A205131d8731D39cbEB",
|
|
||||||
// "8C82B2fd82FaeD2711d59AF0F2499D16e726f6b2",
|
|
||||||
// "11b39756c042441be6d8650b69b54ebe715e2343",
|
|
||||||
// "54Ce5B4D348fb74B958e8966e2ec3dBd4958a7cd",
|
|
||||||
// "15e7cAF07C4e3DC8e7C469f92C8Cd88FB8005a20",
|
|
||||||
// "74a3bf913953D695260D88BC1aA25A4eeE363ef0",
|
|
||||||
// "000aC0076727b35FBea2dAc28fEE5cCB0fEA768e",
|
|
||||||
// "AF45Ced136b9D9e24903464AE889F5C8a723FC14",
|
|
||||||
// "f93124b7c738843CBB89E864c862c38cddCccF95",
|
|
||||||
// "D2CC37A4dc036a8D232b48f62cDD4731412f4890",
|
|
||||||
// "DA798F6896A3331F64b48c12D1D57Fd9cbe70811",
|
|
||||||
// "71AA1BE1D36CaFE3867910F99C09e347899C19C3",
|
|
||||||
// "8192b6E7387CCd768277c17DAb1b7a5027c0b3Cf",
|
|
||||||
// "178e21ad2E77AE06711549CFBB1f9c7a9d8096e8",
|
|
||||||
// "5E1487F35515d02A92753504a8D75471b9f49EdB",
|
|
||||||
// "6FbEBc898F403E4773E95feB15E80C9A99c8348d"
|
|
||||||
// ]
|
|
||||||
|
|
||||||
let GUARDIAN_SECONDS_TO_LIVE = "1000000000";
|
|
||||||
let MESSAGE_FEE = 0;
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${WORMHOLE_PACKAGE_ID}::setup::complete`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(DEPLOYER_CAP),
|
|
||||||
tx.object(UPGRADE_CAP),
|
|
||||||
tx.pure(GOVERNANCE_CHAIN),
|
|
||||||
tx.pure(GOVERNANCE_CONTRACT),
|
|
||||||
tx.pure(GUARDIAN_SET_INDEX),
|
|
||||||
tx.pure(INITIAL_GUARDIANS.map((x) => [...Buffer.from(x, "hex")])),
|
|
||||||
tx.pure(GUARDIAN_SECONDS_TO_LIVE),
|
|
||||||
tx.pure(MESSAGE_FEE),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
let res = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(res);
|
|
||||||
|
|
||||||
// Return publish transaction info
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,111 +0,0 @@
|
||||||
/// Deploy Pyth to Sui testnet (devnet deploy can be done via CLI)
|
|
||||||
import {
|
|
||||||
fromB64,
|
|
||||||
getPublishedObjectChanges,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
testnetConnection,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import fs from "fs";
|
|
||||||
import { resolve } from "path";
|
|
||||||
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings.
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
// Load registry and provider.
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
await publishPackage(wallet, "~/developer/wormhole/sui/wormhole");
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function publishPackage(
|
|
||||||
signer: RawSigner,
|
|
||||||
//network: Network,
|
|
||||||
packagePath: string
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
// Build contracts
|
|
||||||
const buildOutput: {
|
|
||||||
modules: string[];
|
|
||||||
dependencies: string[];
|
|
||||||
} = JSON.parse(
|
|
||||||
execSync(
|
|
||||||
`sui move build --dump-bytecode-as-base64 --path ${packagePath} 2> /dev/null`,
|
|
||||||
{
|
|
||||||
encoding: "utf-8",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("buildOutput: ", buildOutput);
|
|
||||||
|
|
||||||
// Publish contracts
|
|
||||||
const transactionBlock = new TransactionBlock();
|
|
||||||
|
|
||||||
// important
|
|
||||||
transactionBlock.setGasBudget(5000000000);
|
|
||||||
|
|
||||||
const [upgradeCap] = transactionBlock.publish({
|
|
||||||
modules: buildOutput.modules.map((m: string) => Array.from(fromB64(m))),
|
|
||||||
dependencies: buildOutput.dependencies.map((d: string) =>
|
|
||||||
normalizeSuiObjectId(d)
|
|
||||||
),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Transfer upgrade capability to deployer
|
|
||||||
transactionBlock.transferObjects(
|
|
||||||
[upgradeCap],
|
|
||||||
transactionBlock.pure(await signer.getAddress())
|
|
||||||
);
|
|
||||||
|
|
||||||
// Execute transactions
|
|
||||||
const res = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update network-specific Move.toml with package ID
|
|
||||||
const publishEvents = getPublishedObjectChanges(res);
|
|
||||||
if (publishEvents.length !== 1) {
|
|
||||||
throw new Error(
|
|
||||||
"No publish event found in transaction:" +
|
|
||||||
JSON.stringify(res.objectChanges, null, 2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return publish transaction info
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,96 +0,0 @@
|
||||||
/// Initialize Wormhole on Sui testnet
|
|
||||||
import {
|
|
||||||
fromB64,
|
|
||||||
getPublishedObjectChanges,
|
|
||||||
normalizeSuiObjectId,
|
|
||||||
RawSigner,
|
|
||||||
TransactionBlock,
|
|
||||||
SUI_CLOCK_OBJECT_ID,
|
|
||||||
JsonRpcProvider,
|
|
||||||
Ed25519Keypair,
|
|
||||||
testnetConnection,
|
|
||||||
Connection,
|
|
||||||
} from "@mysten/sui.js";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import fs from "fs";
|
|
||||||
import { resolve } from "path";
|
|
||||||
|
|
||||||
import dotenv from "dotenv";
|
|
||||||
|
|
||||||
import { REGISTRY, NETWORK } from "../registry";
|
|
||||||
|
|
||||||
dotenv.config({ path: "~/.env" });
|
|
||||||
|
|
||||||
// Network dependent settings
|
|
||||||
let network = NETWORK.TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
const walletPrivateKey = process.env.SUI_TESTNET; // <= NOTE: Update this when changing network
|
|
||||||
|
|
||||||
// Load registry and provider.
|
|
||||||
const registry = REGISTRY[network];
|
|
||||||
const provider = new JsonRpcProvider(
|
|
||||||
new Connection({ fullnode: registry["RPC_URL"] })
|
|
||||||
);
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
if (walletPrivateKey === undefined) {
|
|
||||||
throw new Error("SUI_TESTNET unset in environment");
|
|
||||||
}
|
|
||||||
const wallet = new RawSigner(
|
|
||||||
Ed25519Keypair.fromSecretKey(Buffer.from(walletPrivateKey, "hex")),
|
|
||||||
provider
|
|
||||||
);
|
|
||||||
await init_wormhole(wallet, registry["WORMHOLE_PACKAGE_ID"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
async function init_wormhole(signer: RawSigner, WORMHOLE_PACKAGE_ID: string) {
|
|
||||||
try {
|
|
||||||
const tx = new TransactionBlock();
|
|
||||||
|
|
||||||
tx.setGasBudget(2500000000);
|
|
||||||
|
|
||||||
let DEPLOYER_CAP =
|
|
||||||
"0x19f253b07e88634bfd5a3a749f60bfdb83c9748910646803f06b60b76319e7ba";
|
|
||||||
let UPGRADE_CAP =
|
|
||||||
"0x746cbe8c14f9ef163fc4e18c1edc6fc61041e118f7d6e751bcc4162b722636d4";
|
|
||||||
let GOVERNANCE_CHAIN = 1;
|
|
||||||
let GOVERNANCE_CONTRACT = "04";
|
|
||||||
let GUARDIAN_SET_INDEX = 0;
|
|
||||||
let INITIAL_GUARDIANS = ["13947bd48b18e53fdaeee77f3473391ac727c638"];
|
|
||||||
let GUARDIAN_SECONDS_TO_LIVE = "100000000";
|
|
||||||
let MESSAGE_FEE = 0;
|
|
||||||
|
|
||||||
tx.moveCall({
|
|
||||||
target: `${WORMHOLE_PACKAGE_ID}::setup::complete`,
|
|
||||||
arguments: [
|
|
||||||
tx.object(DEPLOYER_CAP),
|
|
||||||
tx.object(UPGRADE_CAP),
|
|
||||||
tx.pure(GOVERNANCE_CHAIN),
|
|
||||||
tx.pure(GOVERNANCE_CONTRACT),
|
|
||||||
tx.pure(GUARDIAN_SET_INDEX),
|
|
||||||
tx.pure(INITIAL_GUARDIANS.map((x) => [...Buffer.from(x, "hex")])),
|
|
||||||
tx.pure(GUARDIAN_SECONDS_TO_LIVE),
|
|
||||||
tx.pure(MESSAGE_FEE),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
let res = await signer.signAndExecuteTransactionBlock({
|
|
||||||
transactionBlock: tx,
|
|
||||||
options: {
|
|
||||||
showInput: true,
|
|
||||||
showEffects: true,
|
|
||||||
showEvents: true,
|
|
||||||
showObjectChanges: true,
|
|
||||||
showBalanceChanges: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(res);
|
|
||||||
|
|
||||||
// Return publish transaction info
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@pythnetwork/pyth-sui-js",
|
"name": "@pythnetwork/pyth-sui-js",
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"description": "Pyth Network Sui Utilities",
|
"description": "Pyth Network Sui Utilities",
|
||||||
"homepage": "https://pyth.network",
|
"homepage": "https://pyth.network",
|
||||||
"author": {
|
"author": {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import {
|
import {
|
||||||
|
builder,
|
||||||
JsonRpcProvider,
|
JsonRpcProvider,
|
||||||
ObjectId,
|
ObjectId,
|
||||||
SUI_CLOCK_OBJECT_ID,
|
SUI_CLOCK_OBJECT_ID,
|
||||||
|
@ -117,7 +118,11 @@ export class SuiPythClient {
|
||||||
target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,
|
target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,
|
||||||
arguments: [
|
arguments: [
|
||||||
tx.object(this.pythStateId),
|
tx.object(this.pythStateId),
|
||||||
tx.pure(Array.from(updates[0])),
|
tx.pure(
|
||||||
|
builder
|
||||||
|
.ser("vector<u8>", Array.from(updates[0]), { maxSize: 16 * 1024 })
|
||||||
|
.toBytes()
|
||||||
|
),
|
||||||
verifiedVaas[0],
|
verifiedVaas[0],
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
tx.object(SUI_CLOCK_OBJECT_ID),
|
||||||
],
|
],
|
||||||
|
@ -184,7 +189,11 @@ export class SuiPythClient {
|
||||||
target: `${packageId}::pyth::create_price_feeds_using_accumulator`,
|
target: `${packageId}::pyth::create_price_feeds_using_accumulator`,
|
||||||
arguments: [
|
arguments: [
|
||||||
tx.object(this.pythStateId),
|
tx.object(this.pythStateId),
|
||||||
tx.pure(Array.from(updates[0])),
|
tx.pure(
|
||||||
|
builder
|
||||||
|
.ser("vector<u8>", Array.from(updates[0]), { maxSize: 16 * 1024 })
|
||||||
|
.toBytes()
|
||||||
|
),
|
||||||
verifiedVaas[0],
|
verifiedVaas[0],
|
||||||
tx.object(SUI_CLOCK_OBJECT_ID),
|
tx.object(SUI_CLOCK_OBJECT_ID),
|
||||||
],
|
],
|
||||||
|
|
Loading…
Reference in New Issue