[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:
Mohammad Amin Khashkhashi Moghaddam 2023-08-15 17:56:43 +02:00 committed by GitHub
parent 55129e5b89
commit b189937365
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 763 additions and 18568 deletions

View File

@ -19,10 +19,11 @@
"url": "git+https://github.com/pyth-network/pyth-crosschain.git"
},
"dependencies": {
"@mysten/sui.js": "^0.37.1",
"@mysten/sui.js": "^0.32.2",
"@certusone/wormhole-sdk": "^0.9.8",
"@pythnetwork/cosmwasm-deploy-tools": "*",
"@pythnetwork/price-service-client": "*",
"@pythnetwork/pyth-sui-js": "*",
"@injectivelabs/networks": "1.0.68",
"bs58": "^5.0.0",
"ts-node": "^10.9.1",

View File

@ -10,6 +10,7 @@ import {
import { Chain, SuiChain } from "../chains";
import { DataSource } from "xc_admin_common";
import { Contract } from "../base";
import { SuiPythClient } from "@pythnetwork/pyth-sui-js";
export class SuiContract extends Contract {
static type = "SuiContract";
@ -59,27 +60,8 @@ export class SuiContract extends Contract {
* @param objectId
*/
async getPackageId(objectId: ObjectId): Promise<ObjectId> {
const provider = this.getProvider();
const state = await provider
.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");
const client = this.getSdkClient();
return client.getPackageId(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 provider = this.getProvider();
let result = await provider.getDynamicFieldObject({
@ -150,7 +132,13 @@ export class SuiContract extends Contract {
if (result.data.content.dataType !== "moveObject") {
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({
id: priceInfoObjectId,
options: { showContent: true },
@ -185,18 +173,60 @@ export class SuiContract extends Contract {
async executeMigrateInstruction(vaa: Buffer, keypair: Ed25519Keypair) {
const tx = new TransactionBlock();
const packageId = await this.getPythPackageId();
let decreeReceipt = await this.getVaaDecreeReceipt(tx, packageId, vaa);
let verificationReceipt = await this.getVaaVerificationReceipt(
tx,
packageId,
vaa
);
tx.moveCall({
target: `${packageId}::migrate::migrate`,
arguments: [tx.object(this.stateId), decreeReceipt],
arguments: [tx.object(this.stateId), verificationReceipt],
});
return this.executeTransaction(tx, keypair);
}
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) {
@ -205,11 +235,15 @@ export class SuiContract extends Contract {
);
const tx = new TransactionBlock();
const packageId = await this.getPythPackageId();
let decreeReceipt = await this.getVaaDecreeReceipt(tx, packageId, vaa);
let verificationReceipt = await this.getVaaVerificationReceipt(
tx,
packageId,
vaa
);
tx.moveCall({
target: `${packageId}::governance::execute_governance_instruction`,
arguments: [tx.object(this.stateId), decreeReceipt],
arguments: [tx.object(this.stateId), verificationReceipt],
});
return this.executeTransaction(tx, keypair);
@ -223,11 +257,15 @@ export class SuiContract extends Contract {
) {
const tx = new TransactionBlock();
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({
target: `${packageId}::contract_upgrade::authorize_upgrade`,
arguments: [tx.object(this.stateId), decreeReceipt],
arguments: [tx.object(this.stateId), verificationReceipt],
});
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.
* @param tx
* @param packageId pyth package id
* @param vaa
* @private
*/
private async getVaaDecreeReceipt(
async getVaaVerificationReceipt(
tx: TransactionBlock,
packageId: string,
vaa: Buffer
) {
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({
target: `${wormholePackageId}::vaa::parse_and_verify`,
@ -272,12 +306,11 @@ export class SuiContract extends Contract {
],
});
let [decreeReceipt] = tx.moveCall({
target: `${wormholePackageId}::governance_message::verify_vaa`,
arguments: [tx.object(this.wormholeStateId), verifiedVAA, decreeTicket],
typeArguments: [`${packageId}::governance_witness::GovernanceWitness`],
let [verificationReceipt] = tx.moveCall({
target: `${packageId}::governance::verify_vaa`,
arguments: [tx.object(this.stateId), verifiedVAA],
});
return decreeReceipt;
return verificationReceipt;
}
/**
@ -361,7 +394,7 @@ export class SuiContract extends Contract {
return Number(fields.last_executed_governance_sequence);
}
private getProvider() {
getProvider() {
return new JsonRpcProvider(new Connection({ fullnode: this.chain.rpcUrl }));
}

199
package-lock.json generated
View File

@ -39,9 +39,10 @@
"dependencies": {
"@certusone/wormhole-sdk": "^0.9.8",
"@injectivelabs/networks": "1.0.68",
"@mysten/sui.js": "^0.37.1",
"@mysten/sui.js": "^0.32.2",
"@pythnetwork/cosmwasm-deploy-tools": "*",
"@pythnetwork/price-service-client": "*",
"@pythnetwork/pyth-sui-js": "*",
"bs58": "^5.0.0",
"ts-node": "^10.9.1",
"typescript": "^4.9.3"
@ -94,38 +95,6 @@
"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": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
@ -421,18 +390,18 @@
}
},
"contract_manager/node_modules/@mysten/sui.js": {
"version": "0.37.1",
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.37.1.tgz",
"integrity": "sha512-nEOqnjUqb/VJcVk23LgZOX1FmBib/mBCwAWaJhtsCHLwv2jIAfCPY/fpB9lJ62QHrM8UFclpWxsLkqcUkKyPgA==",
"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.3",
"@mysten/bcs": "0.7.1",
"@noble/curves": "^1.0.0",
"@noble/hashes": "^1.3.0",
"@open-rpc/client-js": "^1.8.1",
"@scure/bip32": "^1.3.0",
"@scure/bip39": "^1.2.0",
"@suchipi/femver": "^1.0.0",
"events": "^3.3.0",
"jayson": "^4.0.0",
"rpc-websockets": "^7.5.1",
"superstruct": "^1.0.3",
"tweetnacl": "^1.0.3"
},
@ -440,14 +409,6 @@
"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": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
@ -11508,54 +11469,6 @@
"@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": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz",
@ -50271,11 +50184,6 @@
"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": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
@ -59663,7 +59571,8 @@
}
},
"target_chains/sui/sdk/js": {
"version": "1.0.0",
"name": "@pythnetwork/pyth-sui-js",
"version": "1.0.1",
"license": "Apache-2.0",
"dependencies": {
"@mysten/sui.js": "^0.32.2",
@ -67929,40 +67838,6 @@
"@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": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz",
@ -82103,9 +81978,10 @@
"requires": {
"@certusone/wormhole-sdk": "^0.9.8",
"@injectivelabs/networks": "1.0.68",
"@mysten/sui.js": "^0.37.1",
"@mysten/sui.js": "^0.32.2",
"@pythnetwork/cosmwasm-deploy-tools": "*",
"@pythnetwork/price-service-client": "*",
"@pythnetwork/pyth-sui-js": "*",
"bs58": "^5.0.0",
"prettier": "^2.6.2",
"ts-node": "^10.9.1",
@ -82153,32 +82029,6 @@
"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": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
@ -82481,30 +82331,22 @@
}
},
"@mysten/sui.js": {
"version": "0.37.1",
"resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.37.1.tgz",
"integrity": "sha512-nEOqnjUqb/VJcVk23LgZOX1FmBib/mBCwAWaJhtsCHLwv2jIAfCPY/fpB9lJ62QHrM8UFclpWxsLkqcUkKyPgA==",
"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.3",
"@mysten/bcs": "0.7.1",
"@noble/curves": "^1.0.0",
"@noble/hashes": "^1.3.0",
"@open-rpc/client-js": "^1.8.1",
"@scure/bip32": "^1.3.0",
"@scure/bip39": "^1.2.0",
"@suchipi/femver": "^1.0.0",
"events": "^3.3.0",
"jayson": "^4.0.0",
"rpc-websockets": "^7.5.1",
"superstruct": "^1.0.3",
"tweetnacl": "^1.0.3"
},
"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": {
"version": "1.2.1",
"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",
"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": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",

View File

@ -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).
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
public fun update_single_price_feed(
@ -91,39 +91,26 @@ public fun get_price(
# 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)
To build and test the contracts, run the following
```
$ make test
$ make build
```
- [Demo for updating a price feed](cli/src/update_price_feeds.ts)
# 4. Contracts Registry
## 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_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_PACKAGE_ID: [0xcc029e2810f17f9f43f52262f40026a71fbdca40ed3803ad2884994361910b7e](https://explorer.sui.io/object/0xcc029e2810f17f9f43f52262f40026a71fbdca40ed3803ad2884994361910b7e?network=testnet)
- WORMHOLE_STATE_ID: [0xebba4cc4d614f7a7cdbe883acc76d1cc767922bc96778e7b68be0d15fce27c02](https://explorer.sui.io/object/0xebba4cc4d614f7a7cdbe883acc76d1cc767922bc96778e7b68be0d15fce27c02?network=testnet)
## 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_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_PACKAGE_ID: [0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a](https://explorer.sui.io/object/0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a)
- WORMHOLE_STATE_ID: [0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c](https://explorer.sui.io/object/0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c)
# 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?
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.
Also recall that the list of Pyth price feed IDs can be found [here](https://pyth.network/developers/price-feed-ids#pyth-evm-testnet).
You can also use the sdk utility functions to find the object Ids off-chain.

View File

@ -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.

View File

@ -1,9 +1,13 @@
{
"name": "pyth-sui-integration-test-and-deploy-scripts",
"name": "pyth-sui-cli",
"version": "0.0.1",
"description": "Pyth Sui Integration Tests and Scripts",
"description": "Pyth Sui Integration Cli tools",
"main": "index.js",
"license": "MIT",
"license": "Apache-2.0",
"scripts": {
"cli": "ts-node src/cli.ts"
},
"private": "true",
"dependencies": {
"@certusone/wormhole-sdk": "^0.9.12",
"@mysten/sui.js": "^0.32.2",

View File

@ -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;

View File

@ -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;
}

View File

@ -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,
},
});
}

View File

@ -12,7 +12,7 @@ local = "../../../../wormhole/sui/wormhole"
[addresses]
pyth = "0x0"
wormhole = "0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94"
wormhole = "0xcc029e2810f17f9f43f52262f40026a71fbdca40ed3803ad2884994361910b7e"
[dev-addresses]
pyth = "0x100"

View File

@ -12,7 +12,6 @@ module pyth::contract_upgrade {
use sui::object::{ID};
use sui::package::{UpgradeReceipt, UpgradeTicket};
use wormhole::bytes32::{Self, Bytes32};
use wormhole::bytes::{Self};
use wormhole::cursor::{Self};
use pyth::state::{Self, State};
@ -63,6 +62,13 @@ module pyth::contract_upgrade {
// Update latest executed sequence number to current one.
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 instruction = governance_instruction::from_byte_vec(payload);
@ -71,18 +77,16 @@ module pyth::contract_upgrade {
let action = governance_instruction::get_action(&instruction);
assert!(action == governance_action::new_contract_upgrade(),
E_GOVERNANCE_ACTION_MUST_BE_CONTRACT_UPGRADE);
E_GOVERNANCE_ACTION_MUST_BE_CONTRACT_UPGRADE);
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
let upgrade_payload = governance_instruction::destroy(instruction);
governance::destroy(receipt);
// Proceed with processing new implementation version.
handle_upgrade_contract(pyth_state, upgrade_payload)
take_digest(upgrade_payload)
}
/// Finalize the upgrade that ran to produce the given `receipt`. This
@ -111,18 +115,13 @@ module pyth::contract_upgrade {
fun handle_upgrade_contract(
pyth_state: &mut State,
payload: vector<u8>
digest: Bytes32
): UpgradeTicket {
state::authorize_upgrade(pyth_state, take_digest(payload))
state::authorize_upgrade(pyth_state, digest)
}
fun deserialize(payload: vector<u8>): UpgradeContract {
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);
assert!(bytes32::is_nonzero(&digest), E_DIGEST_ZERO_BYTES);

View File

@ -6,6 +6,8 @@ module pyth::hot_potato_vector {
const E_EMPTY_HOT_POTATO: u64 = 0;
friend pyth::pyth;
#[test_only]
friend pyth::pyth_tests;
// A hot potato containing a vector of elements
struct HotPotatoVector<T: copy + drop> {
@ -32,7 +34,7 @@ module pyth::hot_potato_vector {
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)
}

View File

@ -15,7 +15,7 @@ module pyth::migrate {
use pyth::state::{Self, State};
use pyth::contract_upgrade::{Self};
use pyth::governance::{Self, WormholeVAAVerificationReceipt};
use pyth::governance::{WormholeVAAVerificationReceipt};
struct MigrateComplete has drop, copy {
package: ID
@ -58,19 +58,13 @@ module pyth::migrate {
// This capability ensures that the current build version is used.
let latest_only = state::assert_latest_only(pyth_state);
// Check if build digest is the current one.
let digest =
contract_upgrade::take_digest(
governance::take_payload(&receipt)
);
let digest = contract_upgrade::take_upgrade_digest(receipt);
state::assert_authorized_digest(
&latest_only,
pyth_state,
digest
);
governance::destroy(receipt);
// Finally emit an event reflecting a successful migrate.
let package = state::current_package(&latest_only, pyth_state);
sui::event::emit(MigrateComplete { package });

View File

@ -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

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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

View File

@ -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"
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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 {
}
}

View File

@ -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();

View File

@ -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();

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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 {
}
}

View File

@ -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();

View File

@ -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";

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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();

View File

@ -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;
}

View File

@ -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,
},
});
}

View File

@ -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],
},
};

View File

@ -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();

View File

@ -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();

View File

@ -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;
}

View File

@ -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 {
}
}

View File

@ -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 {
}
}

View File

@ -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 {
}
}

View File

@ -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

View File

@ -1,6 +1,6 @@
{
"name": "@pythnetwork/pyth-sui-js",
"version": "1.0.0",
"version": "1.0.1",
"description": "Pyth Network Sui Utilities",
"homepage": "https://pyth.network",
"author": {

View File

@ -1,4 +1,5 @@
import {
builder,
JsonRpcProvider,
ObjectId,
SUI_CLOCK_OBJECT_ID,
@ -117,7 +118,11 @@ export class SuiPythClient {
target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,
arguments: [
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],
tx.object(SUI_CLOCK_OBJECT_ID),
],
@ -184,7 +189,11 @@ export class SuiPythClient {
target: `${packageId}::pyth::create_price_feeds_using_accumulator`,
arguments: [
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],
tx.object(SUI_CLOCK_OBJECT_ID),
],